設定
すべてのフレームワークは、多数のパラメーターと初期設定を定義するために構成ファイルを使用します。CodeIgniterの構成ファイルは、必要な設定がpublicプロパティであるシンプルなクラスを定義します。
他の多くのフレームワークとは異なり、CodeIgniterの設定可能アイテムは単一のファイルに含まれていません。代わりに、設定可能アイテムを必要とする各クラスには、それを使用するクラスと同じ名前の構成ファイルがあります。アプリケーション構成ファイルは、**app/Config**フォルダーにあります。
構成ファイルの操作
Configオブジェクトの取得
クラスの構成ファイルには、いくつかの異なる方法でアクセスできます。
newキーワード
new
キーワードを使用してインスタンスを作成する
<?php
// Creating new configuration object by hand
$config = new \Config\Pager();
config()
config()
関数を使用する
<?php
// Get shared instance with config function
$config = config('Pager');
// Access config class with namespace
$config = config('Config\\Pager');
$config = config(\Config\Pager::class);
// Creating a new object with config function
$config = config('Pager', false);
名前空間が指定されていない場合、最初に**app/Config**フォルダー内のファイルを探し、見つからない場合は、定義されたすべての名前空間の**Config**フォルダーを探します。
CodeIgniterに付属するすべての構成ファイルは、Config
で名前空間が指定されています。この名前空間をアプリケーションで使用すると、ファイルを正確に見つけることができるため、最適なパフォーマンスが得られます。
注意
v4.4.0より前では、config()
は、config(\Acme\Blog\Config\Blog::class)
のような完全修飾クラス名を指定した場合でも、同じ短い名前のクラスがある場合、**app/Config/**でファイルを見つけていました。この動作はv4.4.0で修正され、指定されたインスタンスが返されるようになりました。
Configプロパティの取得
すべての構成オブジェクトプロパティはpublicであるため、他のプロパティと同様に設定にアクセスできます。
<?php
$config = config('Pager');
// Access settings as object properties
$pageSize = $config->perPage;
構成ファイルの作成
新しい構成が必要な場合は、まず目的の場所に新しいファイルを作成します。デフォルトのファイル場所(ほとんどの場合推奨)は**app/Config**です。
異なる名前空間を使用することで、構成ファイルを任意の**Config**フォルダーに配置できます。
クラスは適切な名前空間を使用し、CodeIgniter\Config\BaseConfig
を拡張して、環境固有の設定を受け取ることができるようにする必要があります。
クラスを定義し、設定を表すpublicプロパティでそれを埋めます。
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
class CustomClass extends BaseConfig
{
public $siteName = 'My Great Site';
public $siteEmail = '[email protected]';
// ...
}
環境変数
今日のアプリケーション設定のベストプラクティスの1つは、環境変数を使用することです。これには、デプロイ間でコードを変更せずに環境変数を簡単に変更できるという理由があります。構成はデプロイ全体で大きく変わる可能性がありますが、コードはそうではありません。たとえば、開発者のローカルマシンや本番サーバーなどの複数の環境では、通常、特定の設定ごとに異なる構成値が必要です。
環境変数は、パスワード、APIキー、その他の機密データなどの機密情報にも使用する必要があります。
Dotenvファイル
CodeIgniterでは、「dotenv」ファイルを使用することで、環境変数を簡単かつ手間なく設定できます。この用語は、「env」というテキストの前にドットで始まるファイル名に由来します。
Dotenvファイルの作成
CodeIgniterは、**app**ディレクトリの横にあるプロジェクトのルートに** .env **ファイルがあることを想定しています。CodeIgniterで配布されているテンプレートファイルがあり、プロジェクトルートに**env**という名前で配置されています(先頭にドット(.
)がないことに注意してください)。
これには、プロジェクトで使用される可能性のある変数の大きなコレクションがあり、それらは空、ダミー、またはデフォルト値に割り当てられています。テンプレートを** .env **に名前変更するか、** .env **という名前のコピーを作成することで、このファイルをアプリケーションの出発点として使用できます。
警告
**.env**ファイルがバージョン管理システムによって追跡されないようにしてください。gitの場合、これは** .gitignore **に追加することを意味します。そうしないと、機密性の高いクレデンシャルが公開される可能性があります。
変数の設定
設定は、イコール記号で区切られた名前と値のペアの簡単なコレクションとして、** .env **ファイルに保存されます。
S3_BUCKET = dotenv
SECRET_KEY = super_secret_key
CI_ENVIRONMENT = development
アプリケーションを実行すると、** .env **が自動的にロードされ、変数が環境に配置されます。変数が環境にすでに存在する場合、上書きされることはありません。
変数の取得
ロードされた環境変数には、getenv()
、$_SERVER
、または$_ENV
のいずれかを使用してアクセスできます。
<?php
$s3_bucket = getenv('S3_BUCKET');
$s3_bucket = $_ENV['S3_BUCKET'];
$s3_bucket = $_SERVER['S3_BUCKET'];
警告
** .env **ファイルの設定は、$_SERVER
および$_ENV
に追加されることに注意してください。副作用として、これはCodeIgniterアプリケーションが(たとえば)var_dump($_ENV)
またはphpinfo()
(デバッグまたはその他の正当な理由のため)を生成している場合、またはdevelopment
環境で詳細なエラーレポートが表示されている場合、セキュアなクレデンシャルが公開されていることを意味します。
変数のネスト
タイプ数を減らすために、ファイル内で既に指定した変数を ${...}
で囲むことで再利用できます。
BASE_DIR = "/var/webroot/project-root"
CACHE_DIR = "${BASE_DIR}/cache"
TMP_DIR = "${BASE_DIR}/tmp"
名前空間付き変数
同じ名前の変数が複数ある場合があります。システムは、どの設定が正しいかを認識する方法が必要です。この問題は、変数を「名前空間」で区切ることで解決されます。
名前空間付き変数は、ドット表記を使用して変数名を修飾し、環境に取り込まれる際に一意になるようにします。これは、識別可能な接頭辞、ドット(.)、そして変数名自体を含めることで行われます。
// not namespaced variables
name = "George"
db = my_db
// namespaced variables
address.city = "Berlin"
address.country = "Germany"
frontend.db = sales
backend.db = admin
BackEnd.db = admin
名前空間セパレータ
DockerやCloudFormationなど、一部の環境では、変数名にドット (.
) を使用できません。このような場合、v4.1.5以降では、アンダースコア (_
) を区切り文字として使用することもできます。
// namespaced variables with underscore
app_forceGlobalSecureRequests = true
app_CSPEnabled = true
設定クラスと環境変数
設定クラスをインスタンス化すると、名前空間付きの環境変数は設定オブジェクトのプロパティにマージされることが考慮されます。
重要
環境変数を設定して新しいプロパティを追加したり、スカラー値を配列に変更したりすることはできません。「データ置換としての環境変数」を参照してください。
注意
この機能は、CodeIgniter\Config\BaseConfig
クラスで実装されています。そのため、このクラスを拡張しない app/Config フォルダ内のいくつかのファイルでは機能しません。
名前空間付き変数の接頭辞が設定クラスの名前空間と完全に一致する場合、設定 (ドットの後) の末尾の部分は設定プロパティとして扱われます。既存の設定プロパティと一致する場合は、環境変数の値が設定ファイルからの対応する値を置き換えます。一致しない場合は、設定クラスのプロパティは変更されません。この使用法では、接頭辞はクラスの完全な (大文字と小文字を区別する) 名前空間である必要があります。
Config\App.forceGlobalSecureRequests = true
Config\App.CSPEnabled = true
注意
名前空間の接頭辞とプロパティ名の両方で大文字と小文字が区別されます。設定クラスファイルで定義されている完全な名前空間とプロパティ名と正確に一致する必要があります。
短い接頭辞、つまり設定クラス名の小文字バージョンのみを使用した名前空間も同様です。短い接頭辞がクラス名と一致する場合、.env の値が設定ファイルの値と置き換えられます。
app.forceGlobalSecureRequests = true
app.CSPEnabled = true
v4.1.5以降では、アンダースコアを使用して記述することもできます。
app_forceGlobalSecureRequests = true
app_CSPEnabled = true
注意
短い接頭辞を使用する場合でも、プロパティ名はクラスで定義された名前と正確に一致する必要があります。
データ置換としての環境変数
.env に含まれる環境変数は、既存のデータの置換のみであるということを常に覚えておくことが非常に重要です。
簡単に言えば、.env で設定することで、Configクラスに存在するプロパティの値のみを変更できます。
Configクラスで定義されていないプロパティを追加したり、定義されたプロパティの値がスカラーである場合に配列に変更したりすることはできません。
たとえば、.env に app.myNewConfig = foo
を記述しただけで、Config\App
にそのプロパティと値が実行時に魔法のように追加されることを期待することはできません。
Config\Database
にプロパティ $default = ['encrypt' => false]
がある場合、.env に database.default.encrypt.ssl_verify = true
を記述したとしても、encrypt
の値を配列に変更することはできません。そのようにしたい場合は、「データベース設定」を参照してください。
環境変数を配列として扱う
名前空間付き環境変数は、配列としてさらに処理できます。接頭辞が設定クラスと一致する場合、環境変数名の残りの部分は、ドットも含まれている場合に配列参照として扱われます。
// regular namespaced variable
Config\SimpleConfig.name = George
// array namespaced variables
Config\SimpleConfig.address.city = "Berlin"
Config\SimpleConfig.address.country = "Germany"
これが SimpleConfig 設定オブジェクトを参照していた場合、上記の例は次のように扱われます。
<?php
$address['city'] = 'Berlin';
$address['country'] = 'Germany';
$address
プロパティのその他の要素は変更されません。
配列のプロパティ名を接頭辞として使用することもできます。環境ファイルに次のようなものが保持されている場合、結果は上記と同じになります。
// array namespaced variables
Config\SimpleConfig.address.city = "Berlin"
address.country = "Germany"
異なる環境の処理
複数の環境の設定は、その環境のニーズに合わせて値を変更した別の .env ファイルを使用することで簡単に実現できます。
このファイルには、アプリケーションで使用されるすべての設定クラスのすべての可能な設定が含まれている必要はありません。実際には、環境に固有の項目や、パスワードやAPIキーなどの機密情報、公開すべきではないその他の情報のみを含める必要があります。ただし、デプロイメント間で変更されるものはすべて有効です。
各環境で、プロジェクトのルートフォルダに .env ファイルを配置します。ほとんどの設定では、これは app
ディレクトリと同じレベルになります。
バージョン管理システムで .env ファイルを追跡しないでください。もしそうした場合、リポジトリが公開されると、誰でも見つけることができる場所に機密情報を置いたことになります。
レジストラー
「レジストラー」とは、追加の設定プロパティを提供する可能性のあるその他のクラスのことです。レジストラーは、名前空間とファイル全体で実行時に設定を変更する手段を提供します。
レジストラーは、「自動検出」が「モジュール」で有効になっている場合に機能します。Config オブジェクトがインスタンス化されると、設定プロパティが変更されます。
レジストラーを実装する方法は、暗黙的と明示的の2つあります。
注意
.env の値は、常にレジストラーよりも優先されます。
暗黙的なレジストラー
暗黙的なレジストラーは、任意の Config クラスのプロパティを変更できます。
任意の名前空間は、Config/Registrar.php ファイルを使用して、暗黙的なレジストラーを定義できます。これらのファイルは、拡張する各設定クラスの名前が付けられたメソッドを持つクラスです。
たとえば、サードパーティのモジュールまたはComposerパッケージは、開発者が既に設定した内容を上書きせずに、Config\Pager
に追加のテンプレートを提供したい場合があります。src/Config/Registrar.php には、単一の Pager()
メソッドを持つ Registrar
クラスがあります (大文字と小文字を区別することに注意してください)。
<?php
namespace CodeIgniter\Shield\Config;
class Registrar
{
public static function Pager(): array
{
return [
'templates' => [
'module_pager' => 'MyModule\Views\Pager',
],
];
}
}
レジストラーメソッドは常に配列を返す必要があり、キーはターゲット設定ファイルのプロパティに対応します。既存の値はマージされ、レジストラープロパティは上書き優先度を持ちます。
明示的なレジストラー
明示的なレジストラーは、登録されている Config クラスのプロパティのみを変更できます。
設定ファイルでは、明示的に任意の数のレジストラーを指定することもできます。これは、設定ファイルに $registrars
プロパティを追加し、候補となるレジストラーの名前の配列を保持することで行います。
<?php
namespace Config;
// ...
class MyConfig extends BaseConfig
{
public static $registrars = [
SupportingPackageRegistrar::class,
];
// ...
}
「レジストラー」として機能するには、このように識別されたクラスは設定クラスと同じ名前の静的関数を持ち、プロパティ設定の連想配列を返す必要があります。
設定オブジェクトがインスタンス化されると、$registrars
内の指定されたクラスをループ処理します。これらの各クラスについて、設定クラスの名前が付けられたメソッドを呼び出し、返されたプロパティを取り込みます。
このための設定クラスのサンプル設定
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
class MySalesConfig extends BaseConfig
{
public int $target = 100;
public string $campaign = 'Winter Wonderland';
public static $registrars = [
'\App\Models\RegionalSales',
];
}
…および関連する地域販売モデルは次のようになります。
<?php
namespace App\Models;
class RegionalSales
{
public static function MySalesConfig(): array
{
return [
'target' => 45,
];
}
}
上記の例では、MySalesConfig
がインスタンス化されると、宣言された3つのプロパティで終了しますが、$target
プロパティの値は RegionalSales
を「レジストラー」として扱うことで上書きされます。結果として得られる設定プロパティ
<?php
$target = 45;
$campaign = 'Winter Wonderland';