CodeIgniter4の設定クラスについて

この記事は CodeIgniter Advent Calendar 2022 - Qiita の18日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

CodeIgniter4の初期設定については、 「CodeIgniter 4.2の初期設定」 を参照してください。

設定ファイル

CodeIgniter4アプリの設定ファイルは、app/Config/ 以下に配置します。

設定ファイルは CodeIgniter\Config\BaseConfig を継承したクラスです。

名前空間は、App\Config ではなく Config です。

設定ファイルの作成

CodeIgniter\Config\BaseConfig を継承したクラスを app/Config/ に追加するだけです。

プロパティは public に設定します。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class Site extends BaseConfig
{
    public $siteName  = 'My Awesome Site';
    public $siteEmail = 'webmaster@example.jp';
    // ...
}

設定ファイルの読み込み

クラスなので new すればインスタンス化できて値を取得できます。

<?php

$siteConfig = new \Config\Site();

echo $siteConfig->siteName;

また、フレームワークの提供する config() 関数を使うこともできます。

<?php

$siteConfig = config('Site');

echo $siteConfig->siteName;

config() 関数を使った場合は、最初に作成されたインスタンスが共有されます。

なお、モジュールを使用する場合の細かい話(preferAppなど)は、 「CodeIgniter4のモジュール(HMVC)②」 「CodeIgniter4のモジュール(HMVC)内の設定ファイルとヘルパーの呼び出し方」 を参照してください。

環境変数による値の書き換え

設定クラスは、インスタンス化時に環境変数をチェックして、対応するプロパティの値を自動的に書き換えます。

つまり、設定クラスのファイルを見ても、実際のプロパティの値はわかりません。 環境変数の値で変更されている可能性があります。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class Site extends BaseConfig
{
    public $siteName  = 'My Awesome Site';
    public $siteEmail = 'webmaster@example.jp';
    // ...
}

上記の場合、環境変数site.siteNameが存在すれば、その値に変更されます。

区切り文字はドットではなくアンダースコアでもOKです。 つまり、site_siteNameでも構いません。

なお、すでに存在する項目の値を変更することしかできません。

設定値が配列だった場合、既存のキーの値は変更できますが、新たにキーを追加することはできません。 プロパティを追加することもできません。

レジストラのよる値の変更

モジュールからアプリの設定を変更したい場合があります。

例えば、モジュールが提供するフィルターを追加したり、バリデーションルールを追加したい場合です。

そのような場合は、モジュールに Config/Registrar.php を作成することで、既存の設定を変更できます。

例えば、以下のコードは、フィルタとバリデーションルール、デバッグツールバーのコレクターを追加します。

<?php

declare(strict_types=1);

namespace CodeIgniter\Shield\Config;

use CodeIgniter\Shield\Authentication\Passwords\ValidationRules as PasswordRules;
use CodeIgniter\Shield\Collectors\Auth;
use CodeIgniter\Shield\Filters\AuthRates;
use CodeIgniter\Shield\Filters\ChainAuth;
use CodeIgniter\Shield\Filters\GroupFilter;
use CodeIgniter\Shield\Filters\PermissionFilter;
use CodeIgniter\Shield\Filters\SessionAuth;
use CodeIgniter\Shield\Filters\TokenAuth;

class Registrar
{
    /**
     * Registers the Shield filters.
     */
    public static function Filters(): array
    {
        return [
            'aliases' => [
                'session'    => SessionAuth::class,
                'tokens'     => TokenAuth::class,
                'chain'      => ChainAuth::class,
                'auth-rates' => AuthRates::class,
                'group'      => GroupFilter::class,
                'permission' => PermissionFilter::class,
            ],
        ];
    }

    public static function Validation(): array
    {
        return [
            'ruleSets' => [
                PasswordRules::class,
            ],
        ];
    }

    public static function Toolbar(): array
    {
        return [
            'collectors' => [
                Auth::class,
            ],
        ];
    }
}

レジストラは、メソッド名に設定クラス名を指定し、プロパティ名をキーにした配列を返します。

すると、設定クラスのインスタンス化時に、その配列の値がマージされます。

レジストラを使うと、アプリの設定ファイルを変更することなく、そのモジュールの機能を追加できます。

なお、レジストラはオートディスカバリーの設定でオフに変更できます。

この記事は CodeIgniter Advent Calendar 2022 - Qiita の18日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

関連

参考

Date: 2022/12/18

Tags: codeigniter, codeigniter4