CakePHP4のapp_local.phpを掘り下げてみる

CakePHP4のapp_local.phpを掘り下げてみる

config/app_local.phpというものは、「対象のCakePHP4アプリケーションを動かす環境」で使用する設定ファイルです。
ポイントは「動かす環境」です。

開発環境なのか、ステージング環境なのか。もしかしたら本番環境なのか。
どういう環境なのかわかりませんけども、とにかく「動かす環境」がターゲットになります。

今回はこのconfig/app_local.phpを掘り下げてみることにします。

<今回の実行環境>
CakePHP4.2.4
PHP7.4

DBは使用しませんので割愛します。

そもそも今までのCakePHPはどうだったのか

CakePHP3まではconfig/app_local.phpというものはなく、config/app.phpだけで設定値を全て定義していました。

これはこれで特に運用に問題があったわけではありません。
実際にはconfig/app.default.phpというテンプレートファイルをgit管理対象として、環境毎にconfig/app.default.phpをコピー + リネームしてconfig/app.phpを作成して環境に合わせた設定値を定義する運用でした。

だったのですが、CakePHP4になってからアプリケーション共通の設定値を管理するconfig/app.phpと、環境毎の設定値を管理するconfig/app_local.phpの2つに分かれました。

ここがCakePHP3とCakePHP4の違いです。

app_local.phpの仕組み

config/app.phpを読み込んだ後、config/app_local.phpが存在すれば追加読み込みをするという仕組みになっています。
この部分に関してはconfig/bootstrap.phpの方に該当処理部分があります。

ですので極端な話、config/app.phpの内容をまるっとコピーして環境毎に変更するということも可能です。
それが効率いいのかどうかはさておきとして。

CakePHP4のアプリケーション設定ファイルを確認してみる

恐らく作成済みであろうCakePHP4のアプリケーションディレクトリからconfigディレクトリを見てみると以下のファイルがあるかと思います。

app.php
app_local.example.php
app_local.php

app_local.phpはCakePHP4アプリケーション作成時、もしくはgit clone後にcomposer installを実行した際にapp_local.example.phpをベースにして自動的に作成されます。
要するにapp_local.phpを作成するためのテンプレートファイルです。

この辺に関してはsrc/Console/Installer.phpの中にそれっぽい記載があります。

通常は上記3ファイル中のapp.phpとapp_local.example.phpがgit管理対象になります。
環境毎に変える必要があるapp_local.phpはgit管理対象外です。
普通は環境毎に設定も変わるでしょうから、git管理しても仕方ないです。

というか、git管理してはダメです。

app_local.example.phpの中身を見てみる

見るのはテンプレートファイルであるapp_local.example.phpです。

前述したように実際に使用されるのはapp_local.phpなのですが、git管理対象外ですのでテンプレートファイルの方を見ることにします。

debugはデバッグモード設定

debugは対象のCakePHP4アプリケーションのデバッグモード設定になります。
一番上に記載のあるこの部分です。

'debug' => filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN),

ソースコード自体は「config/.envからDEBUGに定義されている値をセット、定義されていなければtrueをセット」という意味合いです。
ここのdebugがtrueの場合はデバッグモード、falseの場合は非デバッグモードを示します。

config/app_local.phpに直接書いても構わないと言えば構わないのですが、config/.env経由でセットするようにした方が都合がいいことが多い気がします。

SecurityはSALT値設定

Securityは対象のCakePHP4アプリケーションのSALT値、要はハッシュキーの設定になります。
以下の部分が該当します。

'Security' => [
    'salt' => env('SECURITY_SALT', '__SALT__'),
],

これも前述したdebugと同様ですが「config/.envからSECURITY_SALTに定義されている値をハッシュキーとしてセット、定義されていなければ__SALT__という文字列をハッシュキーとしてセット」という意味合いになります。

別記事で触れているのですが、ハッシュキーというものはプロジェクトで使用する暗号化 / 複合化に使用するキーであったりハッシュ文字列を生成する際に使用されるものです。
よく使うものとしてはログイン認証時に使用するユーザパスワードが該当します。

未設定の場合ですと「__SALT__」という文字列をハッシュキーに使用するということになりますので、なんかあんまりよくなさそうです。ここも環境毎に変更するのが妥当ではないかなと思います。

設定する文字列ですがランダム文字列を32文字以上指定するのがいいかと思います。
32文字未満だと警告メッセージか何かが出たような気がします。

ちなみにCakePHP4をcomposer経由でインストールした際、config/app_local.phpは自動的に作成されています。
作成されているconfig/app_local.phpの該当箇所を見ると、SALT値として64文字のランダム文字列が設定されているので見てみるといいかもしれません。

ここも大抵config/.env経由でセットしますが、直接記載しても構いません。


Datasourcesはデータベース接続設定

Datasourcesは対象のCakePHP4アプリケーションで使用するデータベースの接続情報の設定になります。
以下の部分になりますが、コメントは削っています。
自分はMySQLしか使いませんので、PostgreSqlの設定に関しても省いています。

'Datasources' => [
    'default' => [
        'host' => 'localhost',
        'username' => 'my_app',
        'password' => 'secret',
        'database' => 'my_app',
        'url' => env('DATABASE_URL', null),
    ],
    /*
      * The test connection is used during the test suite.
    */
    'test' => [
        'host' => 'localhost',
        'username' => 'my_app',
        'password' => 'secret',
        'database' => 'test_myapp',
        'url' => env('DATABASE_TEST_URL', null),
    ],
],

そのままですが、上記の「default」がデフォルトで使用するデータベースの設定。
「test」がユニットテストで使用する際のデータベース設定になります。
ちなみにtestの方を未設定とか存在しない設定にすると、ユニットテスト実行時にエラーになる場合があります。

hostはデータベース接続先。開発環境ならlocalhostが多いかもしれません。
RDSなんかを使う場合はエンドポイントになると思います。

usernameはデータベース接続ユーザ名、passwordはそのままですが接続ユーザパスワード。
databaseという部分に関してはMySQLの場合だとスキーマと言った方がわかりやすいかもしれません。

Laravelだと.envの方にデータベース接続設定を書いて、それをdatabase.phpの方で読み込む仕組みになっていた気がします。
CakePHP4の場合はconfig/app_local.phpに記載するという違いなだけです。

ちなみにdefaultとtestしかありませんが、必要あればいくらでも増やせます。
使用する際はデータベースを切り替える必要はありますが。

EmailTransportはメール送信設定

EmailTransportは対象のCakePHP4アプリケーションからメール送信機能なんかを作る際に使用する、メール送信設定になります。
以下の箇所になります。

'EmailTransport' => [
    'default' => [
        'host' => 'localhost',
        'port' => 25,
        'username' => null,
        'password' => null,
        'client' => null,
        'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
    ],
],

ここに記載のある設定なのですが、ひとつ注意点があります。
メール送信クラスが「Smtp」の場合に限り有効という点です。

メール送信クラスの設定は何故かconfig/app.phpの方にあります。

'className' => MailTransport::class,

端折ってますが上記の部分がそれです。
この辺はメール送信とはなんぞやという話ですので割愛します。ググるとわかります。

hostはSMTPメール送信元ホスト名です。
Gmail経由でメールをSSL送信する時なんかだと「ssl://smtp.gmail.com」とか入れたりします。

portはSMTPメール送信する際のポート番号です。GmailでSSL送信する時だったら465ですかね。
usernameはメール送信元ユーザ名、passwordはメール送信元ユーザのパスワード。

clientは多分使う機会ないんじゃないかと思うのですが、メールサーバのホスト名です。
最後のurlは見ての通りですがconfig/.envに設定された値をセットしています。

ただconfig/.envの該当箇所はデフォルトだとコメントアウトされていることもあり、使う機会はあまりないと思います。
何をするための設定値かというとconfig/.envにメール送信設定をDNS文字列として設定し、config/app_local.php側で読み込むというものです。

CakePHPの公式に説明があった気がするので、興味がある方はググって下さい。

まとめ

ここまでがconfig/app_local.phpの説明になります。
見ていたファイルはconfig/app_local.example.phpでしたが、まぁいいです。
config/app_local.phpの方に環境毎に差異がある設定値を記載することで、容易に切り替えができるのがわかるかなと思います。

前述した通りですが、config/app_local.phpはconfig/app.phpを読み込んだ後に設定値を追加読み込みするという仕様になっていますので、config/app.phpに記載のある箇所をアプリケーションに応じて記載を増やしてということも可能です。

多少そのようにした方が都合がいいのですが、それはまた別記事で。

お疲れ様でした。

CakePHP4カテゴリの最新記事