構成設定
CakePHP アプリケーションの設定は非常に簡単です。CakePHP の インストールができたら、基本的な Web アプリを作り、それに必要な データベース設定をセットアップしてみましょう。
もちろん CakePHP の柔軟なアーキテクチャの利点を活用するため、 いろいろなオプションの設定手順も用意されています。CakePHP コアから継承された機能に簡単な追加を行なうことで、たとえば URL マッピングルール(route)を追加/設定したり、単語の語尾変化 ルール(inflection)を追加/変更したりできます。
アプリケーションの設定ファイルは、プロジェクトの config/ ディレクトリに置きます。
config/core.php- デバッグレベル、エラー処理、セッション、セキュリティ用のソルト、 内部キャッシュなどのコア設定config/bootstrap.php- アプリケーションの起動処理。キャッシュやログの設定、 プラグインの読み込み、独自の inflection などconfig/database.php- データベース接続 (config/database.php.defaultをコピーして作成します)config/routes.php- URL のルーティングconfig/email.php- メール送信の設定 (config/email.php.defaultをコピーして作成します)config/acl.php、config/acl.ini.php- ACL の設定config/Schema/- データベースセッションや i18n 用のスキーマファイル
CONFIG 定数はこのディレクトリを指します。レガシー構成では同じファイルが app/Config/ にあり、プロジェクトのトップレベルに config/ ディレクトリが無い場合は CONFIG がそちらを 指します。両方の構成については CakePHP のフォルダ構造 を参照してください。
database.php, database.php.default
データベース設定
CakePHP では、データベースの詳細設定は config/database.php ファイルに記載されていることを前提としています。 config/database.php.default ファイルにデータベースの設定例が 記載されています。設定後の内容は、たとえば以下のようになります。
// config/database.php
class DATABASE_CONFIG
{
public $default = [
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'cakephpuser',
'password' => 'c4k3roxx!',
'database' => 'my_cakephp_project',
'prefix' => '',
'encoding' => 'utf8mb4',
];
}モデルの中で $useDbConfig プロパティが指定されない場合は、 $default という名の接続用配列が使われます。たとえばあなたの アプリケーションで、デフォルトのデータベース以外にも従来から 使っている(legacy)データベースを使う必要がある場合、モデルの中で $default 配列と同様の形式で新しいデータベース $legacy を作り、 さらに適切なモデルの中で public $useDbConfig = 'legacy'; のように書きます。
設定配列の中のキー/値のペアを、 あなたの要求に合うように適切に設定してください。
'dsn' キーに 1 つの DSN (URL) を書いて接続を設定することもできます。 たとえば 'dsn' => env('DATABASE_URL') のように書きます。アプリケーションスケルトンの config/database.php.default は DATABASE_URL を読み込みます。テストではこれがテスト用データベースです。 データベースの DSN と 環境変数 を参照してください。
dsn (オプション)mysql://user:password@localhost/my_app?encoding=utf8mb4 のような DSN です。 データソースと接続のキーを 1 つの文字列で設定します。 データベースの DSN を参照してください。v2.12.7 で追加されます。
datasource
この設定配列が使うデータソースの名前。 組み込みのデータベースドライバーは Database/Mysql、Database/Postgres、 Database/Sqlite、Database/Sqlserver です。いずれも PDO を使うので、対応する PDO 拡張 (pdo_mysql、pdo_pgsql、pdo_sqlite、pdo_sqlsrv) がインストールされている必要があります。 プラグインに含まれるデータソースを使う場合は プラグイン記法 という書式で指定します。
persistent
データベースへの永続的接続を使うかどうか。Sqlserver データソースは永続的接続に 対応しておらず、true を指定すると例外が発生します。
host
データソースサーバのホスト名(またはIPアドレス)
login
データベースアカウントのユーザ名
password
データベースアカウントのパスワード
database
この接続で利用するデータベース名
prefix (オプション)
データベース中のすべてのテーブル名の前にこの prefix を付加する。 prefix を使わない場合は空文字列のままにします。
port (オプション)
サーバに接続するための TCP ポート番号または Unix ソケット。 SQL Server では、接続時にホスト名の後ろにポート番号が付加されます。
encoding
接続で使用する文字コード。デフォルトはそのデータベースのデフォルト値です。 MySQL で UTF-8 を使いたい場合は、'utf8' または 'utf8mb4'(ハイフンなし)と指定してください。 文字コードは接続時に PDO の DSN で渡されます (MySQL は charset=...、PostgreSQL は options='--client_encoding=...')。そのため SET NAMES クエリは発行されません。 SQL Server では 'utf8' を指定するとドライバーの UTF-8 エンコーディングが使われます。
flags (オプション)
PDO のコンストラクタに渡す PDO 属性の配列。PHP 8.1 以降、MySQL と SQLite の PDO ドライバーは整数型と浮動小数点型のカラムを PHP の int と float で返します。 従来どおり文字列で受け取る必要がある場合は 'flags' => [PDO::ATTR_STRINGIFY_FETCHES => true] を指定してください。
schema
使用するスキーマ。PostgreSQL (デフォルトは public) と SQL Server (デフォルトは dbo) で使われます。
sslmode (オプション)
PostgreSQL のみ。DSN に付加する sslmode の値です (例: 'require')。
options (オプション)
SQL Server のみ。DSN に付加する接続オプションの配列です (例: ['TrustServerCertificate' => 'yes', 'Encrypt' => 'no'])。
Piece of Cake 2 fork
Sqlserver データソースは SQL Server 2022 以降を対象としています。 ポートは port から読み取り、schema のデフォルトは dbo で、SSL/TLS の設定は options 配列で指定します。CakePHP 2.10 からの移行 を参照してください。
unix_socket
UNIX のソケットファイル経由での接続をサポートするドライバで使われます。 PostgreSQL を Unix ソケット経由で使いたい場合、ホスト(host)の設定値は ブランクのままにしておきます。
ssl_key
SSL キーファイルへのパス。ssl_cert と組み合わせて指定します(MySQL のみサポート)
ssl_cert
SSL 証明書ファイルへのパス。ssl_key と組み合わせて指定します(MySQL のみサポート)
ssl_ca
SSL CA ファイルへのパス(MySQL のみサポート)
settings
キー/値のペアを持つ配列を指定すると、データベースサーバへの 接続が確立された後、これらが SET コマンドとしてサーバに 送られます。現時点では MySQL, Postgres, SQLserver のみでの サポートです。
Changed in version 2.4
settings, ssl_key, ssl_cert, ssl_ca キーは 2.4 で追加されました。
NOTE
prefix 設定はテーブルに対して適用されますが、モデルには 適用されません 。 たとえばあなたが自分の Apple and Flavor モデル用に JOIN テーブルを 作る場合、そのテーブル名は(prefix_apples_prefix_flavors ではなく ) prefix_apples_flavors とし、prefix 設定は 'prefix_' としてください。
ここで、一度 CakePHP の規約 を見ておくことをおすすめします。テーブル(およびいくつかのカラム) に関する正確なネーミングルールを適用することで、自由に Cake の 能力を引き出すことができ、またいくつかの設定作業を省略できます。 たとえば、あなたのデータベーステーブルの名前を big_boxes 、 モデル名を BigBox 、コントローラー名を BigBoxesController とすることで、すべての機能が自動的に有効になります。慣習として、 データベーステーブル名はアンダースコア、小文字、複数形にします。 たとえば bakers, pastry_stores, savory_cakes のようにします。
データベースの DSN
Piece of Cake 2 fork
'dsn' キーは v2.12.7 で追加されます。それより前の リリースでは、このキーは何も言わずに無視されます。CakePHP 3.x 以降の DSN サポート (キーの名前は url) のバックポートで、CakePHP、Doctrine、Symfony の DATABASE_URL の書式を使います。
接続は 'dsn' キーに書いた 1 つの DSN で設定できます。環境ごとの認証情報を 1 つの環境変数に まとめられます。
// config/database.php
class DATABASE_CONFIG
{
public $default = [
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'my_app',
'prefix' => '',
];
public function __construct()
{
// Property defaults cannot call functions, so set the DSN here
$this->default['dsn'] = env('DATABASE_URL');
}
}# config/.env
DATABASE_URL="mysql://my_app:secret@127.0.0.1:3306/my_app?encoding=utf8mb4"DSN は接続を作成するとき (最初の ConnectionManager::getDataSource() の呼び出し。通常は 最初のクエリ) に解析され、各部分が接続のキーに対応付けられます。
| DSN の部分 | 接続のキー |
|---|---|
スキーム mysql | datasource Database/Mysql |
スキーム postgres、postgresql、pgsql | datasource Database/Postgres |
スキーム sqlite | datasource Database/Sqlite |
スキーム sqlserver、mssql、sqlsrv | datasource Database/Sqlserver |
| ユーザーとパスワード | login と password |
| ホストとポート | host (IPv6 アドレスの角括弧は除かれます) と port |
パス (先頭の / を除く) | database |
| クエリパラメーター | 同じ名前のキー |
例:
# MySQL
DATABASE_URL="mysql://user:password@localhost:3306/my_app?encoding=utf8mb4"
# PostgreSQL
DATABASE_URL="postgres://user:password@localhost:5432/my_app?schema=public"
# SQLite in memory
DATABASE_URL="sqlite:///:memory:"
# SQLite file, relative to the working directory (three slashes)
DATABASE_URL="sqlite:///tmp/my_app.sqlite"
# SQLite file, absolute path (four slashes)
DATABASE_URL="sqlite:////var/db/my_app.sqlite"
# SQL Server
DATABASE_URL="sqlserver://user:password@localhost:1433/my_app?encoding=utf8&options[TrustServerCertificate]=yes"- 優先順位: DSN から取り出したキーは配列の同じキーを置き換え、配列のそれ以外のキーは そのまま残ります。CakePHP 3.x 以降と同じです。配列にはデフォルト (
persistent、prefix、encodingなど) を書き、DSN で接続先を決めます。パスワードの無い DSN では配列のpasswordが残るので、空のパスワードはuser:@hostと書いてください。 - 空の値:
'dsn'がnull、''、falseの場合は無視されます。そのためenv('DATABASE_URL')は、環境変数がセットされていなければ配列の値を使います。'dsn'キー自体は、データソースに渡される設定から取り除かれます。 - エンコード: ユーザー、パスワード、ホスト、データベースは URL デコードされます。 パスワードの予約文字はエンコードしてください。
@は%40、?は%3F、#は%23、%は%25です。 - クエリパラメーター: そのままの名前でキーになります。たとえば
encoding、schema、prefix、persistent=true、flags[1002]=SET%20NAMES%20utf8mb4、options[Encrypt]=noです。値のtrue、false、nullは PHP の値になります。flags[1002]の1002はPDO::MYSQL_ATTR_INIT_COMMANDの値です。DSN には定数名を書けません。datasource=MyPlugin.Database/Customはスキームのデータソースを上書きし、登録されていない スキームも使えるようにします。 - IPv6: ホストを角括弧で囲みます。例:
mysql://user:password@[::1]:3306/my_app - エラー: 不正な DSN や未知のスキームでは、接続名を含む
CakeExceptionがスローされます。 メッセージにはユーザー名とパスワードは含まれません。 - プラグインのスキーム: プラグインは
ConnectionManager::setDsnClassMap()でスキームを 追加したり、組み込みのスキームを置き換えたりできます。 DSN スキームの登録 を参照してください。
'dsn' キーは ConnectionManager::create() でも使えます。ConnectionManager::parseDsn() は DSN のキーを返します。
ConnectionManager::create('reporting', ['dsn' => env('REPORTING_DATABASE_URL')]);
ConnectionManager::parseDsn('postgres://user:secret@db:5432/app');
// ['login' => 'user', 'password' => 'secret', 'host' => 'db', 'port' => '5432',
// 'database' => 'app', 'datasource' => 'Database/Postgres']環境変数
デバッグレベル、セキュリティ用のソルト、データベースの認証情報など、環境ごとに異なる設定は、 設定ファイルに書く代わりに env() で環境変数から読み込めます。本番環境では、Web サーバー、 コンテナ、プロセスマネージャーなどの設定で環境変数をセットします。ローカルの開発環境では、 アプリケーションスケルトンが .env ファイルから環境変数を読み込めます。
.env ファイルの読み込み
pieceofcake2/app スケルトンから作成したアプリケーションは、 config/core.php の先頭で josegonzalez/dotenv を使って .env ファイルから環境変数を読み込みます。config/core.php は最初に読み込まれるので、 残りの設定、コンソール、テストで環境変数を使えます。
これは CakePHP 3〜5 のアプリケーションスケルトンにある .env サポートを CakePHP 2 に バックポートしたものです。cakephp/app は、同じライブラリを使って config/bootstrap.php で config/.env を読み込みます。CakePHP 5 と同じく、フレームワーク自体は .env ファイルを読み込まず、アプリケーションが読み込みます。
Piece of Cake 2 fork
.env の読み込みは v2.4.0 から pieceofcake2/app スケルトンに含まれています。ほかの アプリケーションについては、既存のアプリケーションに .env サポートを追加する を参照してください。
スケルトンは、以下のファイルが存在すれば、Symfony の .env ファイルと同じ順に読み込みます。
| ファイル | 読み込まれるとき | Git |
|---|---|---|
config/.env.{APP_ENV}.local | APP_ENV がセットされているとき | 無視 |
config/.env.{APP_ENV} (例: config/.env.test) | APP_ENV がセットされているとき | コミット |
config/.env.local | 常に | 無視 |
config/.env。CakePHP 3〜5 のアプリケーションスケルトンが使う場所です | 常に | 無視 |
プロジェクトルートの .env | 常に | 無視 |
すでにセットされている環境変数は上書きされないので、先に読み込むファイルが後のファイルより 優先され、実際の環境変数 (Web サーバー、シェル、コンテナ、CI) はすべてのファイルより優先されます。 APP_ENV は実際の環境変数から読み込まれます。vendor/bin/phpunit と bin/cake test はデフォルトで APP_ENV=test で動くので、 コミットされている config/.env.test が読み込まれます。このファイルは DATABASE_URL を テスト用データベースに設定します (スケルトンのテスト用データベース を参照)。 自分のマシンだけで使う値は config/.env.local や config/.env.test.local に書いてください。
Piece of Cake 2 fork
以前のスケルトンは config/.env とルートの .env だけを読み込みます。
読み込んだ値は文字列として putenv()、$_ENV、$_SERVER に書き込まれるので、env()、 getenv()、$_ENV、$_SERVER のどれでも読み出せます。
// config/core.php
Configure::write('Security.salt', env('SECURITY_SALT') ?: 'a-default-salt');まず、スケルトンに含まれるサンプルファイルをコピーして編集します。
cp config/.env.example config/.envconfig/.env、config/.env.local、config/.env.*.local、/.env は、スケルトンの .gitignore に記載されています。認証情報を含む .env ファイルはバージョン管理に含めず、代わりに config/.env.example のようなサンプルファイルをコミットしてください。config/.env.test は テストの設定だけを含むので、Symfony と同じようにコミットします。
.env ファイルは開発用です。本番環境では、Web サーバー、コンテナ、プロセスマネージャーなどの 設定で実際の環境変数をセットしてください。実際の環境変数は常にファイルより優先されます。
.env ファイルの書式
.env ファイルには、1 行に 1 つずつ NAME="value" の形式で値を書きます。Symfony や Laravel でも使われている一般的な dotenv の書式です。# で始まる行はコメントです。パーサーは前に付けた export も受け付けますが、付ける必要はありません。
# config/.env
DEBUG="2"
SECURITY_SALT="a-long-random-string"
DATABASE_URL="mysql://my_app:secret@127.0.0.1:3306/my_app"値は必ずクォートしてください。josegonzalez/dotenv は、クォートしない値を真偽値、数値、null に変換します。007 は 7 になり、暗号化シードのような長い数字の列はオーバーフローして別の数値に なります。クォートしない値では、空白の後の # 以降がコメントになります。クォートした値はそのまま 使われます。ダブルクォートの中の ${NAME} は、ファイル内でそれより前に定義された変数の値に置き換え られます。
既存のアプリケーションに .env サポートを追加する
レガシーの app/ 構成のアプリケーションや、以前のバージョンのスケルトンから作成した アプリケーションにも、同じ読み込み処理を追加できます。まずライブラリをインストールします。
composer require josegonzalez/dotenv次に、app/Config/core.php (モダン構成では config/core.php) の先頭に以下のコードを 追加します。use 文はファイル冒頭のコメントの後に、ループは最初の Configure::write() の前に置きます。レガシー構成では CONFIG は app/Config/、ROOT は app/ を含む ディレクトリなので、読み込むファイルは app/Config/.env とプロジェクトルートの .env です。
// app/Config/core.php
use josegonzalez\Dotenv\Loader;
$appEnv = (string)env('APP_ENV');
$dotenvFiles = [CONFIG . '.env.local', CONFIG . '.env', ROOT . DS . '.env'];
if ($appEnv !== '') {
array_unshift($dotenvFiles, CONFIG . ".env.{$appEnv}.local", CONFIG . ".env.{$appEnv}");
}
foreach ($dotenvFiles as $dotenvFile) {
if (!is_file($dotenvFile)) {
continue;
}
$dotenv = new Loader([$dotenvFile]);
foreach ($dotenv->parse()->toArray() as $key => $value) {
if (getenv($key) !== false || isset($_ENV[$key]) || isset($_SERVER[$key])) {
continue;
}
// The parser converts some values to booleans, numbers or null; keep them as strings.
if (is_bool($value)) {
$value = $value ? 'true' : 'false';
}
$value = (string)$value;
putenv($key . '=' . $value);
$_ENV[$key] = $value;
$_SERVER[$key] = $value;
}
unset($dotenv, $key, $value);
}
unset($appEnv, $dotenvFiles, $dotenvFile);.env ファイルを .gitignore に追加し、次の節のように設定の中で env() を使って 環境変数を読み込んでください。
アプリケーションスケルトンの環境変数
pieceofcake2/app スケルトンの config/core.php、config/bootstrap.php、 config/database.php.default、config/email.php.default は、以下の環境変数を読み込みます。これらは config/.env.example に記載されています。
| 環境変数 | 設定 | セットされていない場合 |
|---|---|---|
DEBUG | debug: 0、1、2 (true は 2、false は 0) | 2 |
SECURITY_SALT | Security.salt | config/core.php の値 |
SECURITY_CIPHER_SEED | Security.cipherSeed (1〜4294967295。cipherSeed を参照) | config/core.php の値 |
COOKIE_KEY | Cookie.key。'aes' タイプの CookieComponent のキー ('aes' への移行 を参照) | null。CookieComponent は Security.salt を使います |
DATABASE_URL | default 接続と test 接続の 'dsn' (データベースの DSN を参照) | config/database.php の値 |
MAILER_DSN | default メールプロファイルの 'dsn' (メーラー DSN を参照) | config/email.php の値 |
APP_ENV | config/.env.{APP_ENV} と config/.env.{APP_ENV}.local を読み込みます。vendor/bin/phpunit と bin/cake test ではデフォルトで test | ほかの .env ファイルだけが読み込まれます |
空の環境変数はセットされていないものとして扱われます。.env ファイルも環境変数も無い場合、 アプリケーションは設定ファイルの値を使います。DSN のキーは設定の同じキーを置き換え、それ以外の キーはデフォルトとして残ります。'dsn' キーには、pieceofcake2/cakephp 2.12.7 以降が必要です。
以前のスケルトンから config/database.php や config/email.php を作成した場合は、 config/database.php.default や config/email.php.default の __construct() メソッドを コピーし、test 接続を default として使う APP_ENV の分岐があれば削除してください (代わりに config/.env.test が DATABASE_URL をテスト用データベースに設定します)。 tests/bootstrap.php、bin/cake、webroot/test.php の APP_ENV のデフォルトもスケルトンからコピーしてください。以前のスケルトンは、DB_DATASOURCE、DB_HOST、DB_PORT、 DB_USERNAME、DB_PASSWORD、DB_DATABASE (test 接続は DB_TEST_*) を applyEnv() メソッドで読み込んでいました。1 つの DATABASE_URL がこれらに置き換わります。
# Before
DB_HOST="127.0.0.1"
DB_USERNAME="my_app"
DB_PASSWORD="secret"
DB_DATABASE="my_app"
# After
DATABASE_URL="mysql://my_app:secret@127.0.0.1/my_app"たとえば、開発用の config/.env は次のようになります。
# config/.env
DEBUG="2"
DATABASE_URL="mysql://my_app:secret@127.0.0.1:3306/my_app?encoding=utf8mb4"
MAILER_DSN="smtp://127.0.0.1:1025"自分のマシンのテスト用データベースは config/.env.test.local に書きます。テストでは config/.env.test と config/.env より優先されます。
# config/.env.test.local
DATABASE_URL="mysql://my_app:secret@127.0.0.1:3306/test_my_app?encoding=utf8mb4"クラスの読み込みと追加のクラスパス
CakePHP フレームワークのクラスは Composer のオートローダーで読み込まれるので、 App::uses() を書く必要はありません。アプリケーションのクラスも、 pieceofcake2/app スケルトンのように composer.json に classmap を追加すれば同じようにオートロードできます。
"autoload": {
"classmap": ["src/"]
}こうしておけば、src/ にあるコントローラー、モデル、ヘルパーなどのクラスに対する App::uses() は削除できます。新しいクラスファイルを追加したら、classmap に含まれるように 毎回 composer dump-autoload を実行してください。Composer のオートロードに対応していない プラグインでは、引き続き App::uses() が必要です (例: App::uses('MyPluginHelper', 'MyPlugin.View/Helper'))。
Piece of Cake 2 fork
フレームワークは include path ではなく Composer の classmap で 読み込まれるようになり、フレームワーク内の App::uses() は削除されました。 App::uses() を使っているアプリケーションのコードはそのまま動きます。
App::uses() と App::build() は引き続き使えます。App::uses() を使った場合、 CakePHP はアプリケーションディレクトリ (src/、レガシー構成では app/) からクラスを探します。 テンプレートは templates/、ロケールは resources/locales/、プラグインは plugins/ からも探します。
同一システム上の複数のアプリケーション間で MVC クラスを共有できると 有用な場合があります。両方のアプリケーションで同一のコントローラーを 持たせたい場合、CakePHP の config/bootstrap.php を使ってそれらの追加クラスを 読み込ませることができます。
config/bootstrap.php の中で App::build() を使うと、CakePHP がクラスを検索する際の追加パスを定義できます。
App::build([
'Model' => [
'/path/to/models',
'/next/path/to/models',
],
'Model/Behavior' => [
'/path/to/behaviors',
'/next/path/to/behaviors',
],
'Model/Datasource' => [
'/path/to/datasources',
'/next/path/to/datasources',
],
'Model/Datasource/Database' => [
'/path/to/databases',
'/next/path/to/database',
],
'Model/Datasource/Session' => [
'/path/to/sessions',
'/next/path/to/sessions',
],
'Controller' => [
'/path/to/controllers',
'/next/path/to/controllers',
],
'Controller/Component' => [
'/path/to/components',
'/next/path/to/components',
],
'Controller/Component/Auth' => [
'/path/to/auths',
'/next/path/to/auths',
],
'Controller/Component/Acl' => [
'/path/to/acls',
'/next/path/to/acls',
],
'View' => [
'/path/to/views',
'/next/path/to/views',
],
'View/Helper' => [
'/path/to/helpers',
'/next/path/to/helpers',
],
'Console' => [
'/path/to/consoles',
'/next/path/to/consoles',
],
'Console/Command' => [
'/path/to/commands',
'/next/path/to/commands',
],
'Console/Command/Task' => [
'/path/to/tasks',
'/next/path/to/tasks',
],
'Lib' => [
'/path/to/libs',
'/next/path/to/libs',
],
'Locale' => [
'/path/to/locales',
'/next/path/to/locales',
],
'Vendor' => [
'/path/to/vendors',
'/next/path/to/vendors',
],
'Plugin' => [
'/path/to/plugins',
'/next/path/to/plugins',
],
]);NOTE
追加パスの設定は、すべて bootstrap.php の先頭で行ってください。 こうすることで、アプリケーションのそれ以降の処理でこれらのパスが 有効になります。
core.php, configuration
コア(中核部)設定
CakePHP の各アプリケーションには、CakePHP 内部の振る舞いを決めるための 設定ファイルが含まれます。それは config/core.php です。 このファイルは設定用クラス変数や、あなたのアプリケーションが どう振る舞うかを決めるための定数の定義の集まりです。それぞれの 変数を見て行く前に、まずは CakePHP の設定レジストリである Configure を押さえておく必要があります。
CakePHP のコア設定
Configure クラスは、CakePHP コアの設定用変数群を 管理するために使われます。これらの変数は config/core.php にあります。それぞれの変数の定義や、それらがあなたの CakePHP アプリケーションにどう影響するのかを以下に示します。
debug
CakePHP のデバッグ出力を制御します。 0 = 本番モード。出力を行いません。 1 = エラーや警告を出力します。 2 = エラーや警告、および SQL を出力します。 [ SQL のログは、ビューやレイアウト内で $this->element('sql_dump') をしている場合にのみ表示されます。 ]
アプリケーションスケルトンは、デバッグレベルを環境変数 DEBUG から読み込みます。 環境変数 を参照してください。
Error
あなたのアプリケーションのエラーを処理するためのエラーハンドラー を設定します。デフォルトでは ErrorHandler::handleError() が使われます。これは、debug > 0 の場合は Debugger を使ってエラーを表示し、 debug = 0 の場合は CakeLog でエラーをログに出力します。
サブキー:
handler- callback - エラーを処理するためのコールバック関数。 これには無名関数を含む、あらゆるタイプのコールバックを指定可能です。level- int - 捕捉したいエラーのレベル。trace- boolean - ログファイルにエラーのスタックトレースを出力。
Exception
捕捉されていない例外に対して使われる、例外ハンドラーを設定します。 デフォルトでは ErrorHandler::handleException() が使われます。 これは例外の HTML ページを表示し、さらに debug > 0 の場合であれば、 コントローラーがないといったフレームワークのエラーも表示します。 debug = 0 の場合、フレームワークのエラーは強制的に一般的な HTTP レベルのエラーに変換されます。例外ハンドリングに関する詳細は Exceptions セクションを参照してください。
App.baseUrl
もしあなたのサーバで mod_rewrite (や、その他の互換モジュール) を使いたくない、もしくは使えない場合、CakePHP 組み込みの優れた URL のしくみを使うことになります。 config/core.php で以下のような行のコメントを外して有効にしてください。
Configure::write('App.baseUrl', env('SCRIPT_NAME'));さらに、webroot/.htaccess ファイルを削除します。レガシー構成の場合は、 以下の .htaccess ファイルを削除します。
/.htaccess
/app/.htaccess
/app/webroot/.htaccess
ドキュメントルートは webroot/ (app/webroot/) に設定したままにしてください。 .htaccess ファイルがない状態でドキュメントルートがプロジェクトのディレクトリを指していると、 設定やログ、ソースコードが公開されてしまいます。デプロイ を参照してください。
これであなたの URL は、たとえば www.example.com/controllername/actionname/param ではなく www.example.com/index.php/controllername/actionname/param として扱われます。
もし CakePHP を Apache 以外の環境にインストールしようとしている 場合、それぞれのサーバで URL 書き換えを行なう方法について、 Web サーバーの設定 に記載があります。
App.fullBaseUrl
アプリケーションのルートへの完全修飾ドメイン名 (プロトコルを含む)。 アプリケーション内の任意の URL 生成に特定のドメイン URL を使用するように CakePHP を設定するには、この設定変数をセットしてください。 これにより、完全なベース URL の自動検出が無効になり、CLI (メール送信など) からのリンクの生成に役立ちます。アプリケーションがサブフォルダーで実行されている場合は、 App.base も設定する必要があります。
App.base
app のあるベースディレクトリー。アプリケーションがサブフォルダーで実行され、 App.fullBaseUrl が設定されている場合に使用する必要があります。
App.encoding
あなたのアプリケーションで使用しているエンコーディングを定義します。 このエンコーディングは、レイアウトの中の charset やエンティティ のエンコードを生成するのに使われます。この指定はあなたのデータベース で使用しているエンコーディングと一致させる必要があります。
Routing.prefixes
admin のような CakePHP の接頭辞(prefix)ルーティングを活用 したい場合はコメントを外して有効にします。この変数には使用したい ルーティングの接頭辞名の配列を指定します。詳細は後述します。
Cache.disable
true にすると、サイト全体のキャッシュを無効にします。 これを行なうと、 Cache に対するすべての read/write は失敗します。
Cache.check
true にすると、ビューのキャッシュを有効にします。さらにコントローラー の中でも指定する必要がありますが、この変数はこれらの設定の検出 を行います。
Session
セッション機能に関して使われる設定の配列です。デフォルトのプリセット 定義として 'defaults' キーが使われますが、ここで宣言されている設定は デフォルトの設定を上書きします。
サブキー
cookie- 使用するクッキーの名前。デフォルトは 'CAKEPHP'。timeout- セッションの有効期間(単位:分)。 この timeout は CakePHP が制御します。cookieTimeout- セッションクッキーを有効にしたい期間(単位:分)。checkAgent- セッションの開始時にユーザーエージェント文字列を チェックするかどうか。セッションの途中でユーザーエージェント文字列が 変わるクライアントに対応する場合は false にしてください。defaults- あなたのセッションの基本構成として使用する デフォルト設定。php, cake, cache, database という4種類の ビルトイン機構があります。handler- ユーザー独自のセッションハンドラーとして使えます。session_save_handlerと一緒に使える callable の配列か、CakeSessionHandlerInterfaceを実装したクラス名をengineキーに持つ配列を指定します。 このオプションを有効にすると、ini 配列にsession.save_handlerが自動的に追加されます。autoRegenerate- この設定を有効にすると、セッションを毎回 自動生成し、セッション ID が頻繁に変わります。詳細はCakeSession::$requestCountdownを参照してください。cacheLimiter- セッションクッキーで使用するキャッシュ制御ヘッダー。 指定できる値は session_cache_limiter() を参照してください。ini- ini の値として追加で設定したい連想配列。
ビルトインのデフォルトは以下の通りです。
- 'php' - あなたの
php.iniで定義されている設定を使う - 'cake' - セッションファイルを CakePHP の
tmp/sessionsディレクトリに保存する - 'database' - CakePHP のデータベースセッションを使う
- 'cache' - セッションの保存に Cache クラスを使う
カスタムセッションハンドラーを定義する場合、 src/Model/Datasource/Session/<name>.php に記載します。 そのクラスは CakeSessionHandlerInterface を 実装している必要があります。 また Session.handler.engine を <name> に設定してください。
データベースセッションを使うには、cake のシェルコマンド bin/cake schema create Sessions を使って、 config/Schema/sessions.php のスキーマからテーブルを作成します。
詳しくは セッション を参照してください。
Security.salt
セキュリティ関連のハッシュ処理で使われるランダムな文字列。CSRF トークンやフォーム改ざん防止用 トークンの署名、CookieComponent のデフォルトの暗号化キーにも使われます。 アプリケーションごとに一意な値に変更し、秘密にしておいてください。 スケルトンのデフォルト値のままだと、CakePHP が警告を表示します。 スケルトンは、環境変数 SECURITY_SALT が設定されていればその値を使います。 生成方法と、変更したときの影響は セキュリティ用のソルトの生成 を参照してください。
Piece of Cake 2 fork
SecurityComponent が発行する CSRF トークンは Security.salt を使った HMAC で署名されるようになりました (CVE-2020-15400)。 ソルトを変更すると、発行済みのトークンは無効になります。 脆弱性への対応 を参照してください。
Security.cipherSeedSecurity::cipher() で文字列を暗号化/復号化するのに使われるランダムな文字列(数字のみ)。 このメソッドを使うのは CookieComponent の暗号化タイプ 'cipher' だけです。 このタイプは脆弱で、後方互換性のためだけに残されています。Cookie には 'aes' タイプを使い、 Security.useOpenSsl が true になっていることを確認してください (app スケルトンでは設定済みです)。 スケルトンは、環境変数 SECURITY_CIPHER_SEED が設定されていればその値を使います。 意味があるのは 1 から 4294967295 までの数値だけです。本家の config/core.php にある 29 桁のデフォルト値を含め、これより長い値はすべて同じ シード 0 になります。どの値にしても 'cipher' タイプは安全になりません。 cipherSeed と Cookie の 'cipher' タイプ を参照してください。
Security.useOpenSsl
true にすると、Security::encrypt() と Security::decrypt() (つまり Cookie の暗号化タイプ 'aes') が mcrypt ではなく OpenSSL を使います。mcrypt 拡張は PHP 7.2 以降同梱されていないので、 config/core.php で有効にしてください。
Configure::write('Security.useOpenSsl', true);デフォルトは false です。pieceofcake2/app のスケルトン (v2.3.1 以降) から 作成したアプリケーションにはこの行が含まれています。既存のアプリケーションでは追加してください。
Asset.timestamp
適切なヘルパーを使っている場合、静的ファイルの URL (CSS, JavaScript, 画像) の末尾に個々のファイルの最終更新時刻 を表すタイムスタンプを追加します。 有効な値は以下の通りです。 (boolean) false - 何もしない(デフォルト) (boolean) true - debug > 0 の場合にタイムスタンプを付加 (string) 'force' - debug >= 0 の場合にタイムスタンプを付加
Acl.classname, Acl.database
CakePHP のアクセス制御リスト(ACL)機能で使われる定数。 詳細はアクセス制御リストの章を参照してください。
NOTE
キャッシュの設定も core.php にあります。これについては後述します。
Configure クラスは、コアの設定をその場で読み書き するのに使われます。これは、たとえばあなたのアプリケーションの 限られた範囲でデバッグ設定を有効にしたい場合などに特に便利です。
セキュリティ用のソルトの生成
Security.salt は、アプリケーションごとに一意で秘密の値にする必要があります。 暗号論的に安全な乱数生成器で生成してください。自分で考えた値や、サンプルにある値を使ってはいけません。 以下のコマンドは、Linux と macOS の POSIX シェル (sh、bash、zsh) で動作します。
Security.salt には、32 バイトの乱数を 64 文字の 16 進数で表した値を使います。
php -r 'echo bin2hex(random_bytes(32)), PHP_EOL;'openssl rand -hex 32ソルトは 32 文字以上にしてください。ソルトは CookieComponent のデフォルトの暗号化キーで、 暗号化タイプ 'aes' (Security::encrypt()) は 32 バイト未満のキーに対して例外を投げます。
Security.cipherSeed を使うのは古い Cookie の 'cipher' タイプだけで、値は 1 から 4294967295 までの 数値にする必要があります。本家の config/core.php にある 29 桁のデフォルト値を含め、これより長い値はすべて同じシードになり、どの値にしても 'cipher' は安全になりません。設定する前に cipherSeed と Cookie の 'cipher' タイプ を 読んでください。
Windows では、コマンドプロンプトや PowerShell で PHP のコマンドを実行するとき、シングルクォートの代わりに ダブルクォートを使ってください。たとえば php -r "echo bin2hex(random_bytes(32)), PHP_EOL;" のようにします。
pieceofcake2/app のスケルトンから作成したアプリケーションでは、これらの値を 環境変数 SECURITY_SALT と SECURITY_CIPHER_SEED で設定します。 開発環境では、次のコマンドでソルトと範囲内のシードを config/.env に追記できます (先に config/.env.example を コピーしておいてください。同じ変数が 2 回設定されている場合は、後の行が有効になります)。
php -r 'printf("SECURITY_SALT=\"%s\"\nSECURITY_CIPHER_SEED=\"%d\"\n", bin2hex(random_bytes(32)), random_int(1, 4294967295));' >> config/.envprintf 'SECURITY_SALT="%s"\nSECURITY_CIPHER_SEED="%s"\n' "$(openssl rand -hex 32)" "$(od -An -N4 -tu4 /dev/urandom | tr -dc 0-9)" >> config/.env値は秘密にし、環境ごとに分けてください。
- 環境 (開発、ステージング、本番) ごと、アプリケーションごとに異なる値を使います。
- 値をコミットしないでください。スケルトンでは
config/.envと.envは Git で無視されます。 本番環境では.envファイルではなく、実際の環境変数を設定してください。値をconfig/core.phpに書く場合は、そのファイルを公開リポジトリに置かないでください。 - ソルトが漏れた場合 (コミットした、共有した、サンプル値のままだった場合など) は、値を変更してください。
ソルトに依存するもの
Security.salt を変更すると、次のものに影響します。
- ソルトを使ってハッシュ化したパスワード。
FormAuthenticateとBasicAuthenticateのデフォルトの パスワードハッシャーであるSimplePasswordHasherと、非推奨のAuthComponent::password()は、 パスワードの前にソルトを付けてハッシュ化します ($salt = trueでのSecurity::hash())。 保存済みのハッシュが一致しなくなり、ユーザーはログインできなくなります。bcrypt のハッシュ (BlowfishPasswordHasher、Security::hash($password, 'blowfish')) はソルトを使わないので影響を受けません。 - 暗号化した Cookie。
CookieComponentは、$this->Cookie->keyを設定しない限りソルトをキーに使います。 また、'aes'タイプは専用のキーを設定してもソルトをキーに組み合わせます。そのため、専用のキーを設定した'cipher'と'rijndael'の Cookie を除き、変更前に書き込んだ Cookie は読めなくなります。 Security::encrypt()で暗号化したデータ。$hmacSaltを指定しない場合はソルトが暗号化キーの一部になるため、 変更前に暗号化した値に対してSecurity::decrypt()はfalseを返します。- セッション。
Session.checkAgentがfalseでない場合 (デフォルト)、セッションにはユーザーエージェントと ソルトのハッシュが保存されているため、既存のセッションは破棄され、ユーザーはログアウトされます。 - CSRF トークンとフォーム改ざん防止用トークン。
SecurityComponentとFormHelperが発行するトークンは ソルトで署名されています。変更前に表示したフォームは一度だけ拒否されます。
Security.cipherSeed を使うのは Security::cipher() だけです。変更すると Security::cipher() で暗号化した値が 読めなくなります。実際には、CookieComponent のデフォルトの暗号化タイプ 'cipher' で書き込んだ Cookie が該当します。 cipherSeed と Cookie の 'cipher' タイプ を参照してください。
ソルトの変更手順
セッション、CSRF トークン、フォームのトークンは自然に回復します。ユーザーがログインし直し、フォームを 送信し直せばよいので、利用の少ない時間帯にソルトを変更してください。変更する前に、長く保存される値を ソルトに依存しないようにしておきます。
ソルトを使ったパスワードのハッシュを bcrypt (
'passwordHasher' => 'Blowfish') に移行します。 ハッシュは変換できないので、ユーザーのログイン時に古いハッシュで確認し、パスワードの bcrypt ハッシュを 保存します。ソルトを使ったハッシュがなくなってからソルトを変更するか、残ったユーザーにパスワードの 再設定を求めてください。デフォルトの
$hmacSaltでSecurity::encrypt()を使って暗号化した保存済みの値は、古いソルトをSecurity::decrypt()に渡して暗号化し直します。Security.saltと一緒に変わらない専用の$hmacSaltを渡すようにすると、より安全です。php$plain = Security::decrypt($encrypted, $key, $oldSalt); $encrypted = Security::encrypt($plain, $key, $hmacSalt);暗号化した Cookie は引き継げません。
'aes'タイプはキーにSecurity.saltを組み合わせるため、 ソルトを変更すると Cookie は読めなくなり、ログイン状態を保持する Cookie を持っていたユーザーは 一度ログインし直す必要があります。まだ'cipher'タイプを使っている場合は、同時に専用のキーを設定した'aes'に移行すれば、Cookie が失われるのは一度だけで済みます。その際はSecurity.useOpenSslがtrueになっていることを確認してください (app スケルトンでは設定済みです。'aes'への移行 を参照してください)。
その他の秘密の値
Security::encrypt()とSecurity::decrypt()に渡すキーや、CookieComponentのキーは 32 バイト以上に してください。Security.saltと同じ方法で生成し、COOKIE_KEYからCookie.keyに読み込むように、環境変数から設定に読み込みます ('aes'への移行 を参照してください)。- データベースやメールのパスワード、API キーは、コミットするコードではなく、環境変数や、
config/database.phpとconfig/email.phpのような Git で無視されるファイルに置いてください。
cipherSeed と Cookie の 'cipher' タイプ
Security.cipherSeed を使うのは Security::cipher() だけです。実際には、デフォルトの暗号化タイプが 'cipher' である CookieComponent がこれに当たります。'cipher' タイプは以前から安全でないと 説明されており、後方互換性のためだけに残されています。この節では、シードの既知の弱点と、 それがアプリケーションに与える影響、'aes' タイプへの移行方法を説明します。
シードの使われ方
Security::cipher() は mt_srand((int)(float)$seed) で PHP のメルセンヌ・ツイスタを初期化し、 mt_rand() で得た数値と値を XOR します。キー (CookieComponent のキーを設定していなければ Security.salt) も組み合わされます。
mt_srand() のシードは 32 ビットなので、意味があるのは 1 から 4294967295 までの数値だけです。 これより長い値にしても何も加わりません。
- 19 桁を超える値は PHP の整数に収まらず、変換でビットが失われます。
- 27 桁以上の値と、26 桁の値の約 95% は、すべてシード
0になります。
シード 0 になるよく知られた値には、次のものがあります。
76859309657453542496749683645: 本家 CakePHP 2 と、v2.12.5 までのこのフォークのconfig/core.phpのデフォルト値。pieceofcake2/appスケルトンの以前のバージョンから作成したアプリケーションでも、環境変数がない場合の 値として使われています7485712659625147843639846751: 本家のドキュメントのブログチュートリアルにあるサンプル値pieceofcake2/appスケルトンの以前のバージョンのconfig/.env.exampleに書かれていたコマンドで 生成した 30 桁の値
範囲内のシードでも十分ではありません
1 から 4294967295 までのシードにすれば 0 になることは避けられますが、'cipher' が安全になるわけでは ありません。
- シードは約 43 億通りしかないため、すべて試すことができます。
- キーストリームは暗号用ではないメルセンヌ・ツイスタで生成され、値はそれと XOR されるだけです。
Security.salt(またはCookieComponentのキー) も組み合わされますが、それで本当の暗号化になる わけではありません。
シードがどの値であっても、値を秘密にするために 'cipher' に頼らないでください。
影響
- 影響を受けるのは
Security::cipher()で暗号化した値だけです。つまり、CookieComponentが'cipher'タイプ (デフォルト) で書き込む Cookie と、アプリケーションが直接呼び出すSecurity::cipher()です。Cookie の'aes'と'rijndael'タイプ、Security::encrypt()、 パスワードのハッシュ、セッション、CSRF トークンはシードを使いません。 - 上記のいずれかの値や、その他の 27 桁以上の値を使っているアプリケーションでは、シードは秘密として まったく役に立たず、そうしたアプリケーションはすべて同じシードを使っています。
- シードをほかの値に変更すると、
'aes'に切り替えた場合と同じように、既存の'cipher'の Cookie は 読めなくなります。
どうすればよいですか
- 新しいアプリケーション:
'aes'への移行 のとおり、専用のキーを設定した'aes'タイプを使い、'cipher'は使わないでください。Security.useOpenSslはtrueにします (app スケルトンでは設定済みです)。 'cipher'の Cookie を使っている既存のアプリケーション:'aes'に移行してください。 既存の Cookie の値は一度だけ失われます。たとえば、ログイン状態を保持する Cookie でログインしていた ユーザーはログインし直す必要があり、Cookie に保存した設定は元に戻ります。手順は'aes'への移行 を参照してください。- 移行期間中も古い Cookie を読み続ける必要があるアプリケーション: 影響なく移行する方法は ありません。古い Cookie を読めるのは古いシードを使い続けている間だけで、その間は弱点も残ります。 範囲内のシードに変更するとキーストリームも変わるため、結局古い Cookie は読めなくなり、 変更後も
'cipher'は安全ではありません。Cookie が一度失われる日を決めておき、シードだけを 変更するのではなく、その日に'aes'に切り替えてください。 CookieComponentもSecurity::cipher()も使っていないアプリケーション、 または'aes'タイプだけを使っているアプリケーション:Security.cipherSeedを 1 から 4294967295 までの有効な値にすること以外に、することはありません。
'aes' への移行
32 バイトの乱数で Cookie のキーを生成します。
Security.saltを使い回さないでください。bashphp -r 'echo bin2hex(random_bytes(32)), PHP_EOL;'bashopenssl rand -hex 32生成した値を環境変数
COOKIE_KEYに設定します。開発環境ではconfig/.envに書き、 本番環境では実際の環境変数として設定してください。Security.useOpenSslがtrueになっていることを確認します (app スケルトンでは設定済みです)。'aes'タイプが使うSecurity::encrypt()とSecurity::decrypt()は、この設定がtrueのときだけ OpenSSL を使います。そうでない場合は PHP 8 には存在しないmcryptを呼び出すため、'aes'の Cookie は失敗します。古いアプリケーションにはこの行がないことがあるので、config/core.phpに 追加してください (OpenSSL を有効にする を参照してください)。phpConfigure::write('Security.useOpenSsl', true);CookieComponentのタイプとキーを設定します。方法はpieceofcake2/cakephpのバージョンによって 異なります。下記を参照してください。
Piece of Cake 2 fork
v2.12.6 以降では、Cookie.type と Cookie.key を設定で指定できます。
v2.12.6 以降: config/core.php のソルトの近くで設定します。コントローラーを変更する必要は ありません。pieceofcake2/app スケルトンの新しいバージョンにはこれらの行があります。 config/core.php にない場合は追加してください。
// config/core.php
/**
* Default encryption type and key of CookieComponent. The key is a random
* value of at least 32 bytes.
*
* The key can be set with the COOKIE_KEY environment variable.
*/
Configure::write('Cookie.type', 'aes');
Configure::write('Cookie.key', env('COOKIE_KEY') ?: null);CookieComponent のタイプは、'type' の設定または $this->Cookie->type() が最優先で、次に Cookie.type、どちらもなければ 'cipher' です。キーは、'key' の設定または $this->Cookie->key が 最優先で、次に Cookie.key、どちらもなければ Security.salt です。
v2.12.5 以前: CookieComponent は Cookie.type と Cookie.key を読まないため、上の設定は 効果がありません。config/core.php の Cookie.key の行は残し、タイプとキーはコントローラーで渡します。 タイプはコンポーネントの設定で指定し、キーは Cookie を読む前に beforeFilter() で設定します。 AppController、またはこのコンポーネントを使うすべてのコントローラーで設定してください。
// src/Controller/AppController.php
public $components = [
'Cookie' => ['type' => 'aes'],
];
public function beforeFilter()
{
parent::beforeFilter();
$key = Configure::read('Cookie.key');
if ($key) {
$this->Cookie->key = $key;
}
}null を代入するとデフォルトのキーが置き換えられて暗号化に失敗するため、キーは値が設定されている 場合だけ代入してください。'type' の設定は v2.12.3 から反映されます。それより古いバージョンでは beforeFilter() で $this->Cookie->type('aes'); を呼び出してください。明示的な設定が優先される ため、このコードは v2.12.6 以降もそのまま動作します。
'aes' タイプには 32 バイト以上のキーが必要です。COOKIE_KEY が設定されていない場合、Cookie.key は null になり、キーには Security.salt が使われます。ソルトが 32 バイト未満の場合、暗号化した Cookie を書き込んだり読んだりするたびに、Security::encrypt() と Security::decrypt() が CakeException を投げます。
必要に応じて
$this->Cookie->nameで Cookie の名前を変更します。そうすると、古い'cipher'の Cookie は新しいタイプで復号されずに無視され、そのまま期限切れになります。デプロイします。ログイン状態を保持する Cookie を持っていたユーザーは、一度ログインし直します。
'aes' タイプが使う Security::encrypt() は、キーに Security.salt も組み合わせます。 後で Security.salt を変更すると、'aes' の Cookie も読めなくなります。
cipherSeed の生成
'cipher' をまだ使っている場合に限り、Security.cipherSeed を 1 から 4294967295 までの数値にします。 これで 0 になることは避けられますが、'cipher' は安全でないままです。また、シードを変更すると 既存の 'cipher' の Cookie は読めなくなります。
php -r 'echo random_int(1, 4294967295), PHP_EOL;'od -An -N4 -tu4 /dev/urandom | tr -dc 0-9; echov2.12.6 以降の警告
Piece of Cake 2 fork
v2.12.6 以降の pieceofcake2/cakephp は、動作を変えずに次の問題を報告します。
'cipher'は非推奨です。プロセス (1 回のリクエストや 1 回のコンソール実行) の中で最初に'cipher'タイプまたはSecurity::cipher()を使うと、デバッグモードがオフでもwarningを ログに記録します。デバッグモードがオンのときは、同じメッセージをE_USER_DEPRECATEDとしても 発生させます。メッセージには呼び出し元と対処方法 (Security.useOpenSslを有効にして、Cookie.typeを'aes'に、Cookie.keyを 32 バイト以上のランダムな値にすること) が含まれます。Security.cipherSeedが 1 から 4294967295 までの数字だけの値でない場合は、プロセスの中で最初にSecurity::cipher()を呼び出したときにwarningもログに記録します。シードの値そのものは 記録しません。デバッグモードがオンのときは、Debugger::checkSecurityKeys()(AuthComponentから呼ばれます) がこのようなシードに対してE_USER_NOTICEも発生させます。- アプリケーションに
config/core.phpがない場合にだけ使われるコアの代替のconfig/core.phpは、 範囲内のシード'2659758734'(app スケルトンと同じデフォルト値) を設定し、Security.useOpenSslを 有効にします。デフォルトのSecurity.cipherSeedの変更を求める通知は、以前のデフォルト値と この新しいデフォルト値の両方で表示されます。 Cookie.typeとCookie.keyでCookieComponentのデフォルトのタイプとキーを設定できます ('aes'への移行 を参照してください)。
値の暗号化と復号は以前とまったく同じなので、既存の Cookie はそのまま読め、例外も投げられません。 警告を消すためだけに Security.cipherSeed を変更しないでください。シードを変えると既存の 'cipher' の Cookie が読めなくなり、どのシードでも 'cipher' は安全ではありません。代わりに 'aes' に 移行してください。
テストで非推奨の警告や通知を例外にしている場合、テスト実行中の最初の 'cipher' の使用や、 デバッグモードがオンで範囲外のシードのときの AuthComponent は失敗するようになります。 アプリケーションを 'aes' に移行したら、IntegrationTestTrait の cookieEncrypted() / assertCookieEncrypted() のモードに 'aes' を渡してください。
v2.12.5 以前では何も報告されませんが、弱点は同じです。
構成用定数
ほとんどの構成用設定は Configure によって処理されますが、実行時に CakePHP が参照する定数がいくつか存在します。
constant LOG_ERROR
エラー定数。エラーログ出力とデバッグを区別するのに使われます。 現在 PHP は LOG_DEBUG をサポートします。
コアのキャッシュ設定
CakePHP は内部的に _cake_model_ と _cake_core_ という2つのキャッシュ設定を使います。_cake_core_ はファイルの パスやオブジェクトの格納位置を保存するのに使われ、_cake_model_ はスキーマの定義やデータソースのソース一覧を保存するのに使われます。 これらはリクエストのたびに参照されるので、APCu や Memcached のような 高速なキャッシュストレージを使うことをおすすめします。デフォルト では debug > 0 の場合、いずれの設定も 10 秒おきに有効期限が切れます。 どちらも config/core.php の末尾で定義されています。
使用できるキャッシュエンジンは File、Apc (APCu 拡張が読み込まれていれば APCu を使います)、 Memcached、Memcache、Redis です。
Piece of Cake 2 fork
Xcache と Wincache のキャッシュエンジンは削除されました。 これらを使っている設定は、上記のいずれかのエンジンに切り替えてください。
Cache に保存されたすべてのキャッシュデータと同じく、 Cache::clear() を使ってクリアできます。
Configure クラス
class Configure
CakePHP では設定が必要な項目はほとんどありませんが、あなたの アプリケーション固有の設定ルールを作ることが有用な場合もあります。 あなたは過去に、いくつかのファイルの中で変数や定数を定義することで、 独自の設定値を持たせていたようなケースがあったかもしれません。 この方法では、これらの値を使うために毎回設定ファイルを インクルードする必要がありました。
CakePHP の Configure クラスは、アプリケーションや実行時固有の値を 保存したり取り出したりするのに使います。注意していただきたいのですが、 このクラスは、その中にいかなるものでも格納することができ、さらにあなたの コードのいかなる箇所でもそれらを使うことができてしまいます。 これにより、CakePHP のデザインの元になっている MVC パターンを 壊してしまうことになりかねません。 Configure クラスのそもそもの目的は、 多数のオブジェクト間で共有できる変数群の集中管理です。 "convention over configuration(設定より規約)"の世界の中で生きようと する努力を怠らず、せっかく私たちが整えた MVC 構造という環境を壊すことの ないようにしてください。
このクラスは、あなたのアプリケーション中の静的なコンテキストにおいて、 いかなるところからでも呼び出せるようになっています。
Configure::read('debug');static Configure::write($key, $value)
string $key: 書き込むキー。ドット記法が使えます。mixed $value: 保存する値
アプリケーションの設定の中で write() を使ってデータを格納します。
Configure::write('Company.name', 'Pizza, Inc.');
Configure::write('Company.slogan', 'Pizza for your body and soul');NOTE
$key パラメーターで使われる ドット記法 により、 あなたの構成設定値を論理的にグループ化できます。
直前の例は、以下のような単一の呼び出しとしても書けます。
Configure::write(
'Company',
[
'name' => 'Pizza, Inc.',
'slogan' => 'Pizza for your body and soul',
],
);Configure::write('debug', $int) を使えば、その場で動的に デバッグモードと本番モードを行ったり来たりできます。特に、 JSON や XML のレスポンスではデバッグ情報がパースエラーの原因と なりがちなので、それを防ぐのに有効です。
static Configure::read($key = null)
string $key: 読み込むキー。ドット記法が使えます。
アプリケーションから設定データを読み込むのに使います。デフォルトは CakePHP で重要な debug 値です。何らかのキーが指定されたらその データを返します。前述の write() の例を元に、そのデータを呼び出して みましょう。
Configure::read('Company.name'); // 'Pizza, Inc.' が返されます
Configure::read('Company.slogan'); // 'Pizza for your body and soul' が返されます
Configure::read('Company');
// 返される値:
['name' => 'Pizza, Inc.', 'slogan' => 'Pizza for your body and soul'];$key を指定しない場合、 Configure にあるすべての値を返します。指定された $key に関連する 値が存在しない場合、 null を返します。
static Configure::consume($key)
string $key: 読み込むキー。ドット記法が使えます。
Configure からキーを読み込み、同時に削除します。値の読み込みと削除を 1 回の操作で行いたい場合に便利です。
static Configure::check($key)
string $key: チェックするキー。
key/path が存在し、かつ null でない値を持つかどうかをチェックします。
Added in version 2.3
Configure::check() は 2.3 で追加されました。
static Configure::delete($key)
string $key: 削除するキー。ドット記法が使えます。
アプリケーションの設定から情報を削除します。
Configure::delete('Company.name');static Configure::version()
現在のアプリケーションで動いている CakePHP のバージョンを返します。
static Configure::config($name, $reader)
string $name: 接続中のリーダー(読み込み機構)の名前ConfigReaderInterface $reader: 接続されるリーダーのインスタンス
Configure に設定リーダーを接続します。接続されたリーダーは、 設定ファイルをロードするのに使われます。設定ファイルを読み込む 方法の詳細は 設定ファイルのロード をご覧ください。
static Configure::configured($name = null)
string $name: チェックするリーダーの名前。指定しない場合、 接続されているすべてのリーダーの一覧が返されます。
指定された名前のリーダーが接続されているかをチェックするか、 または接続されたリーダーの一覧を取得します。
static Configure::drop($name)
接続されているリーダーオブジェクトを削除します。
設定ファイルを読み書きする
CakePHP には2つのビルトインの設定ファイル用リーダーが備わっています。 PhpReader は PHP の設定ファイルを読むことができますが、 Configure も歴史的にこれと同じフォーマットのファイルを読めるように なっています。 IniReader は ini 形式の設定ファイルを 読むことができます。ini ファイルの仕様については PHP documentation を参照してください。 コアの設定ファイルリーダーを使うには、そのリーダーを Configure::config() で Configure に接続してください。
// CONFIG (config/) から設定ファイルを読み込む
Configure::config('default', new PhpReader());
// 別のパスから設定ファイルを読み込む
Configure::config('default', new PhpReader('/path/to/your/config/files/'));どちらのリーダーも、デフォルトでは CONFIG ディレクトリから読み込みます。 Configure::load('MyPlugin.my_file') のようにプラグイン記法を使うと、 プラグインの Config/ ディレクトリから読み込みます。
Configure に複数のリーダーを接続することができます。それぞれの リーダーは異なった種類の設定ファイル、もしくは異なったタイプの ソースを読みます。Configure に備わっている他のメソッドを使って 接続されたリーダーとやりとりすることもできます。 Configure::configured() を使って接続されている リーダーの別名を取得できます。
// 接続されたリーダーの別名の配列を取得する
Configure::configured();
// 特定のリーダーが接続されているかをチェック
Configure::configured('default');接続されているリーダーを取り外すこともできます。 Configure::drop('default') はデフォルトリーダーの別名を 取り外します。これ以降、そのリーダーを介した設定ファイルの読み込みは 失敗します。
設定ファイルのロード
static Configure::load($key, $config = 'default', $merge = true)
string $key: ロードする設定ファイルの識別子string $config: 設定されたリーダーの別名boolean $merge: 読まれたファイルの中身をマージするか、 それとも既存の値を上書きするか。
Configure に設定リーダーを接続して、設定ファイルを読み込みます。
// リーダーオブジェクト 'default' を使って config/my_file.php をロードする
Configure::load('my_file', 'default');ロードされた設定ファイルは、そのデータを Configure にある既存の 実行時設定とマージします。また、既存の実行時設定を上書きして 新しい値を追加することもできます。 $merge を false にすると、 値は既存の設定には上書きされません。
設定ファイルを生成/変更する
static Configure::dump($key, $config = 'default', $keys = [])
string $key: ファイル名、または生成されるストレージ設定string $config: データを格納するリーダーの名前array $keys: 保存したいトップレベルのキーのリスト。デフォルトは すべてのキー。
Configure にある全部または一部のデータをダンプして、ファイルまたは 設定リーダーでサポートされているストレージシステムに格納します。 シリアライズのフォーマットは $config として接続されている設定 リーダーにより決定されます。たとえば 'default' のアダプターが PhpReader なら、生成されたファイルは PhpReader で読み込みが可能な PHP の設定ファイルになります。
'default' リーダーが PhpReader のインスタンスだとして、Configure にあるすべてのデータを my_config.php というファイルに保存します。
Configure::dump('my_config.php', 'default');エラーハンドラー設定だけを保存します。
Configure::dump('error.php', 'default', ['Error', 'Exception']);Configure::dump() は Configure::load() で読める形式の 設定ファイルを変更または上書きするのにも使えます。
Added in version 2.2
Configure::dump() は 2.2 で追加されました。
実行時設定を保存する
static Configure::store($name, $cacheConfig = 'default', $data = null)
string $name: キャッシュファイルのストレージキーstring $cacheConfig: 設定データを保存するキャッシュ設定の名前mixed $data: 保存するデータ、null にすると Configure 中のすべての データを保存。
将来取り出して使えるように、実行時設定の値を保存することもできます。 configure は現在のリクエストの値しか記憶しないので、何らかの変更した 値を後続するリクエストでも使いたい場合は、それらを保存しておく 必要があります。
// 'default' キャッシュにある 'user_1234' キーの中の現在の設定を保存する
Configure::store('user_1234', 'default');保存された設定データは Cache クラス内で永続的データになります。 これにより、 Cache が扱えるストレージエンジンにおいて、 設定情報を保存できます。
実行時設定を呼び出す
static Configure::restore($name, $cacheConfig = 'default')
string $name: ロードするストレージキーstring $cacheConfig: データをロードするキャッシュ設定
実行時設定を保存した後は、おそらくそこに再度アクセスして値を取り出す ことになります。これは Configure::restore() により行います。
// キャッシュから実行時設定を取り出す
Configure::restore('user_1234', 'default');設定情報を取り出す際は、保存した時に使ったものと同じキャッシュから、 同じキーを使って取り出すことが重要です。取り出された情報は、 既存の実行時設定の上にマージされます。
独自の設定用リーダーを作成する
設定用リーダーは CakePHP の中で拡張可能な部品です。このため、 あなたのアプリケーションとプラグインの中で、設定用リーダーを 新たに作成することも可能です。設定用リーダーは ConfigReaderInterface を実装する必要があります。 このインターフェースでは read() と dump() メソッドが定義されています。 たとえば、あなたが本当に XML ファイルが好きなら、あなたのアプリケーションのために シンプルな XML 設定リーダーを作ることもできます。
// src/Lib/Configure/MyXmlReader.php
class MyXmlReader implements ConfigReaderInterface
{
protected $_path;
public function __construct($path = null)
{
if (!$path) {
$path = CONFIG;
}
$this->_path = $path;
}
public function read($key)
{
$xml = Xml::build($this->_path . $key . '.xml');
return Xml::toArray($xml);
}
/**
* 2.3 以降は dump() メソッドも必須です
*/
public function dump($key, $data)
{
// データをファイルに書き出すコード
}
}config/bootstrap.php でこのリーダーを接続して利用できます。
Configure::config('xml', new MyXmlReader());
// ...
Configure::load('my_xml');src/ を Composer の classmap でオートロードしていれば、composer dump-autoload の後はリーダークラスが自動的に読み込まれます。classmap を使っていない場合は、 先に App::uses('MyXmlReader', 'Configure'); でクラスを読み込んでください。
WARNING
独自の設定クラスに XmlReader という名前を付けるのはおすすめしません。 PHP には同じ名前の組み込みクラス XMLReader があるからです。
設定リーダーの read() メソッドは、 $key という名前のリソースが 保持する設定情報の配列を返さなければなりません。
interface ConfigReaderInterface
Configure で設定データを読んだり保存したりするクラスで 使われるインターフェースを定義します。
method ConfigReaderInterface::read($key)
method ConfigReaderInterface::dump($key, $data)
Added in version 2.3
ConfigReaderInterface::dump() は 2.3 で追加されました。
exception ConfigureException
設定データをロード/保存/復元する際にエラーが発生すると、この例外が投げられます。 ConfigReaderInterface の実装は、エラーが発生した場合にこの例外を投げる必要があります。
ビルトインの設定リーダー
class PhpReader
class IniReader
Inflection(語尾変化)設定
CakePHP の命名規約は実に優れています。あなたのデータベーステーブルに big_boxes 、モデルに BigBox 、コントローラーに BigBoxesController と名前をつけてもらえれば、これですべてが自動的に動作します。 CakePHP はそれぞれの部品を関連付けるにあたり、それぞれの単語の 単数形と複数形を inflecting(語尾の変化) によって把握します。
ここで、CakePHP の Inflector (複数形、単数形、 キャメルケース、アンダースコアへの相互変換を司るクラス)が 思ったように動かないケースを想定してみましょう。これは特に、 英語話者ではない人たちにとって起こりがちです。もし CakePHP があなたの Foci (訳注:focus(焦点)の複数形)や Fish (訳注: 同じ種類の魚の場合は単複同型)を認識してくれない場合、CakePHP にあなたの特別なケースについて教えることができます。
カスタム inflection のロード
カスタム inflection をロードするには config/bootstrap.php ファイルの中に Inflector::rules() を書きます。
Inflector::rules('singular', [
'rules' => [
'/^(bil)er$/i' => '\1',
'/^(inflec|contribu)tors$/i' => '\1ta',
],
'uninflected' => ['singulars'],
'irregular' => ['spins' => 'spinor'],
]);または
Inflector::rules('plural', ['irregular' => ['phylum' => 'phyla']]);これらのコードは、指定されたルールをフレームワークの src/Cake/Utility/Inflector.php (vendor/pieceofcake2/cakephp/src/Cake/Utility/Inflector.php) で定義されている inflection セットにマージし、コアのルールより優先度の高いルールとして追加します。
CakePHP の起動(bootstrap)
もし何らかの追加設定が必要な場合、config/bootstrap.php にある CakePHP の bootstrap ファイルを使います。このファイルは CakePHP のコアな起動処理の直後に実行されます。
このファイルは起動時における多くの共通的な処理に適しています。
- 便利な関数群を定義
- グローバル定数群の登録
- 追加のモデル、ビュー、コントローラーへのパスを定義
- キャッシュ設定の作成
- inflection の構成
- 設定ファイルの読み込み
何かを bootstrap ファイルに追加する場合は、MVC ソフトウェアの デザインパターンを守るよう注意してください。コントローラーで使うための 独自のフォーマット関数をここに入れたくなるかもしれません。
ぜひその誘惑と戦ってください。その先に、必ず良いことがありますよ。
また、何かを AppController クラスに入れることを考慮する 必要があるかもしれません。このクラスはあなたのアプリケーションの すべてのコントローラーの親クラスです。 AppController はあなたのコントローラーすべてにおいて使われるコールバックや メソッドを定義するための便利な場所です。
