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