今日からあなたもCakePHPer

昔の記事を読んでいると、「いろんな意味で若いな」と思いますね。
そんな自分もアラサーです。
イメージしていたものとは大きく違っていますが、まあ色々経験した結果かなとプラスに考えておきます。

さて、今回は、先日3.5がリリースされたCakePHPについて書きます。
私がPHPを学習する際、初めて触れたフレームワークがCakePHP2.xでした。
2.xの配列地獄をご存知の方は、3.xになった際のORMの変更に少なからず戸惑ったのではないかと思います(もちろん良い意味です)。
マイナーバージョンで大きい変更があることも少なくありませんが、ある程度の後方互換が維持されているのはありがたいですね。

最近はLaravelに人気を持っていかれている感はありますが、個人的にはCakePHP3が一番好きなフレームワークなので、いくつかおすすめポイントを書こうと思います。
PHPをある程度使っている方はもちろん、以前の私のように、

  • PHPフレームワーク使いたいけど何が良いのか
  • そもそもPHPの基礎がそこまで固まっていない

といった方も対象です。

「設定より規約(CoC)」という安全性

これが一番大きいと思います。
ファイル名・クラス名・ディレクトリ構成などの「決まり」に則って開発するということは、個人的にはプラスだと思っています。
ある程度の経験があるとこのあたりはどちらでも問題ないのかもしれません。
ただ、PHPフレームワークの経験が浅いと、どのクラスがどういった役割をするのかがイマイチピンとこないケースは多いように感じます。

個人開発なら、ある程度自由にコードを書き始めて、慣れたら適切にモジュール分割していくことが良い学習になります(私もこのタイプでしたし、今も日々改善しています)。

チーム開発なら、開発者に規約という前提があるので、レビューでもコードに集中できます。
経験者がいればなお良いですね。

日本語ドキュメントが充実している

こちらにあるドキュメントがとても役に立ちます。
サンプルコードも多く掲載されているので、実装に迷うこともありません。
オフラインドキュメントも取得できます(こちらは英語です)。

デバッグバーが優秀

デバッグモードだと画面下にバーが表示され、画面表示時に実行されたクエリや変数の値、メモリ使用量や環境変数などを確認できます。
情報量がとても多く、開発中とてもお世話になります。

CLI

bakeコマンドです。
これによってControllerやModelなどのひな型(+テストケース)を作成できます。
マイグレーションも実行可能ですし、それをもとにテスト用のダミーデータの生成スクリプトも用意してくれます。
バッチ処理も書けます。

CakePHPで完結できる安心感

RubyのRuby on Rails、PythonのDjangoのように、基本的にはフレームワークの標準機能(+一部拡張機能)でカバーできるため、導入コストが大きくありません。
基本的なMVCはもちろん、APIClientやメール送信・セキュリティといったアプリケーションに必要な機能は一通り揃っており、上記ドキュメントを見れば大体解決できます。
また、コレクションやHash、テキスト処理などのユーティリティも充実しています。

リポジトリパターン

CakePHP3.xではリポジトリパターンを採用しており、DB問い合わせを行うクラス(Table)とデータを格納するクラス(Entity)は別です。
個人的にはModelになんでもかんでも突っ込むのがあまり好きでないので、これが標準なのはありがたいです。

他にも便利な機能はたくさんあります。
私も日々勉強しているので、皆さんも是非一度使ってみてください。

CakePHP3を使ったシステムのリポジトリはこちら
※PRお待ちしています。

Laravel・Lumenでログ出力先を変更する

最近勢いがあるPHPフレームワークの1つであるLaravelですが、ログファイルのデフォルト出力先は以下になっています。

  • storage/logs/laravel.log

普段、私は自分が作成した複数アプリ(CakePHP・Rails・Django・バッチ処理など)で同じログディレクトリを利用しています(管理しやすいので)。
また、デプロイ時にはシェル側でリンクを切り替えて対応しています。
そのため、プロジェクトディレクトリ以下に出力されると結構不便なんですよね。

Laravelでは、他フレームワークのように「configファイルをいじるだけでディレクトリ・ファイル名を操作する」というのができませんでした。
※ディレクトリの変更自体はApplicationクラスのuseStoragePath()メソッドで可能です。
なので、今回はこれをカスタマイズした方法を紹介します。
といっても、他言語や他フレームワークでやるような継承を使うだけです。

1. 独自のLogServiceProviderを作成

まずはじめに、\Illuminate\Log\LogServiceProviderを継承した独自プロバイダを生成します。

2. 独自のApplicationクラスを作成

次に、独自のApplicationクラスを生成します。
ここで、上記のMyLogServiceProviderを利用するように変更します。

3. 利用するApplicationクラスの変更

最後に、利用するApplicationクラスをMyApplicationに変更します。

これでログ出力をカスタマイズできます。

ちなみに、Laravelの軽量版であるLumenでは、Laravelの手順1が不要で、手順2の独自アプリケーションクラスでgetMonologHandler()を継承するだけで良いです。

CakePHP3で「.env」を使う

世間一般に言われる「ゴールデンウィーク」も今日が最終日ですが、皆様いかがお過ごしでしょうか。
ちなみに、私はずっと開発に集中していました。

さて、今回はCakePHP3で.envファイルを利用する方法についてここに記載しておきます。
Laravelではプロジェクトルートに「.env」ファイルを配置し、その中に設定した値を利用して環境菅野差異を吸収するという手法が取られています(このファイルはバージョン管理外とします)。

Javaを長くやってきた私は、アプリケーションサーバに設定する手法を主に使ってきたので、PHPのWebアプリで使う環境変数はすべてApacheに指定していました。
ただ、最近Webサーバをnginxに変えた際、環境変数の設定に手こずり、あげく「ほんとにこれで良いのか?」となっていました。
アプリ単位で管理するのならそれが良いのかなと今では思っていますので、同様のことをCakePHP3でも実施したというのが今回の対応です。
※ソースはこちらにもあります。

※2017/8/30追記

CakePHP3.5から、dotenvの機能が標準搭載されています。
以下に記載したやり方と異なりますが、今後を考えるとそちらに倣っていただいたほうが良いです。
詳しくはこちらをご覧ください。

ファイルの配置

まずはプロジェクトルートに「.env」を配置します。
今回はini形式にします。

設定読み込み処理追加

リクエスト時に読み込まれるファイルに以下を記載します。
※今回私は「paths.php」に記載しましたが、「bootstrap.php」のほうが良いと思います。

これで、コード上で「.env」に定義したファイルを読み込むことができます。

ちなみに、より柔軟に対応できる「PHP dotenv」というライブラリもありますが、今回はファイル名固定かつ最低限値が読み込めればよかったので、上記対応としました。