アプリケーションスケルトンのドキュメント
pieceofcake2/app は、pieceofcake2/cakephp で動作する CakePHP 2 アプリケーションのためのアプリケーションスケルトンです。CakePHP 5 と互換性のあるディレクトリ構成 (config/、src/、templates/、tests/、webroot/) を使い、CakePHP とすべての依存パッケージを Composer で読み込みます。
WARNING
CakePHP 2.x は既存アプリケーションのメンテナンスのためのものです。新しいプロジェクトには、 CakePHP の現在のメジャーバージョンを使ってください。
レガシーな app/ 構成の既存アプリケーションをこの構成に移すには、 モダン構成への移行 をご覧ください。
動作要件
- PHP 8.0、8.1、8.2、8.3、8.4 または 8.5
- Composer
- データベース: MySQL 5.6 以上、PostgreSQL 9.4 以上、SQLite 3 または SQL Server 2022 以上
- PHP 拡張:
mbstring、intl、opensslと、使用するデータベースの PDO ドライバー
詳しくは pieceofcake2/cakephp の動作要件 をご覧ください。
インストール
Composer の create-project コマンドで新しいアプリケーションを作成します。
composer create-project pieceofcake2/app my_appこれにより my_app ディレクトリが作成され、CakePHP (pieceofcake2/cakephp) が vendor/ に インストールされます。Bake プラグインと DebugKit プラグイン、そして開発ツール (PHPUnit、pieceofcake2/phpstan-cakephp2 を使った PHPStan、 CakePHP コーディング規約) は、開発用の依存パッケージとしてインストールされます。
続けて設定を仕上げます:
config/database.php.defaultをconfig/database.phpにコピーし、DATABASE_URLで接続を設定するか (データベースとメーラーの DSN をご覧ください)、ファイルに入力します。テスト用 データベースはconfig/.env.test.localで設定します (テストの実行 を参照してください)。config/core.phpのSecurity.saltとSecurity.cipherSeedを変更するか、SECURITY_SALTとSECURITY_CIPHER_SEEDを設定します。スケルトンには広く知られたサンプル値が 入っており、実際のアプリケーションで使ってはいけません。 セキュリティ用のソルトの生成 をご覧ください。- メールを送信する場合は、
config/email.php.defaultをconfig/email.phpにコピーし、MAILER_DSNでトランスポートを設定するか、ファイルで設定します。 - Web サーバーが
tmp/とlogs/に書き込めることを確認します。
バージョン管理
スケルトンの .gitignore ファイルはアプリケーション用のものなので、create-project の直後に git init を実行できます。無視されるのは次のものです:
vendor/と、Composer がplugins/にインストールするプラグイン (plugins/Bake/とplugins/DebugKit/)。Composer でさらにプラグインをインストールした場合は、それらを.gitignoreに 追加してください。plugins/にあるアプリケーション独自のプラグインはコミットされます。tmp/とlogs/の中身。ディレクトリを残すためのemptyファイルはコミットされます。- 環境ごとの設定や認証情報を含む
config/database.php、config/email.php、config/.env、config/.env.local、config/.env.*.localと.env。テストの設定であるconfig/.env.testはコミットされます。 phpunit.xml(phpunit.xml.distのローカルコピー) と.phpunit.result.cache。
すべての環境で同じバージョンの依存パッケージがインストールされるように、composer.lock はコミットしてください。
開発用プラグイン
config/bootstrap.php は、Bake プラグインと DebugKit プラグインがインストールされていれば読み込みます。
foreach (['Bake', 'DebugKit'] as $plugin) {
try {
CakePlugin::load($plugin);
} catch (MissingPluginException) {
// The plugin is not installed.
}
}これらは開発用の依存パッケージなので、composer install --no-dev でアプリケーションをインストールした場合は 読み込まれません。Bake は次のように実行します。
bin/cake bakeDebugKit のツールバーを表示するには、AppController に DebugKit.Toolbar コンポーネントを追加します (DebugKit のドキュメント を参照)。開発用の依存パッケージが なくてもアプリケーションが動作するように、プラグインが読み込まれている場合にだけ追加してください。
class AppController extends Controller
{
public function __construct($request = null, $response = null)
{
if (CakePlugin::loaded('DebugKit')) {
$this->components[] = 'DebugKit.Toolbar';
}
parent::__construct($request, $response);
}
}ツールバーが表示されるのは、debug が 0 より大きい場合だけです。
その他のプラグインは、config/bootstrap.php で CakePlugin::load() (または CakePlugin::loadAll()) を使って読み込みます。CakePlugin::load() はプラグインがインストールされていないと MissingPluginException を投げるので、開発用の依存パッケージであるプラグインは上の例のように囲んでください。
ディレクトリ構成
my_app/
├── bin/
│ └── cake the console
├── config/ configuration (core.php, bootstrap.php, routes.php, database.php, ...)
├── logs/ log files
├── plugins/ plugins installed by Composer
├── resources/
│ └── locales/ translation files
├── src/ PHP code
│ ├── Console/ shells, tasks and bake templates
│ ├── Controller/
│ ├── Lib/
│ ├── Model/
│ └── View/ helpers
├── templates/ view templates, layouts, elements and email templates
├── tests/
│ ├── Fixture/
│ └── TestCase/
├── tmp/ cache, sessions and test files
├── vendor/ Composer packages, including CakePHP
└── webroot/ document root (index.php, test.php, css/, js/, img/)webroot/index.php、webroot/test.php と bin/cake は config/define.php を読み込みます。 このファイルは、ルートディレクトリ (ROOT)、アプリケーションディレクトリ (APP_DIR、src)、 ドキュメントルート (WWW_ROOT) と Composer の vendor ディレクトリ (VENDORS) を設定します。 その他のディレクトリは CakePHP が自分で見つけます。config/、tests/、tmp/、logs/、templates/ と resources/locales/ は、存在すれば使われます。
app/ ディレクトリを使うレガシー構成 (app/Config/、app/Controller/、app/View/、...) も サポートされていますが、スケルトンに含まれるのはモダン構成だけです。
設定
| ファイル | 内容 |
|---|---|
config/core.php | デバッグレベル、エラーと例外の処理、キャッシュ、セッション、セキュリティ用のソルト。 |
config/bootstrap.php | キャッシュの設定、プラグインの読み込み、ログ、その他のアプリケーションの初期設定。 |
config/routes.php | URL のルーティング。 |
config/database.php | データベース接続 (default と test)。database.php.default からコピーします。 |
config/email.php | メールのトランスポートとプロファイル。email.php.default からコピーします。 |
config/acl.php、config/acl.ini.php | IniAcl と PhpAcl の設定。 |
config/define.php | モダン構成のパス定数。 |
config/Schema/ | DbAcl、i18n、セッションのテーブルのスキーマファイル。 |
環境変数 (.env)
デバッグレベル、セキュリティ用のソルト、データベースの認証情報などの設定は、環境変数から読み込めます。 ローカルでの開発では、サンプルファイルをコピーして編集します。
cp config/.env.example config/.env
# or, in the project root:
cp config/.env.example .env.env ファイルは、config/core.php の先頭で josegonzalez/dotenv を使って読み込まれます (そのため、Web リクエスト、bin/cake、テストのすべてに適用されます)。値は env()、 getenv()、$_ENV、$_SERVER で参照できます。Symfony と同じように、ファイルは次の順に読み込まれ、すでに 設定されている変数は上書きされません。そのため、先に読み込まれるファイルが後のファイルより優先され、実際の環境変数 (Web サーバー、シェル、コンテナ、CI) はすべてのファイルより優先されます。
| ファイル | 読み込まれるとき | Git |
|---|---|---|
config/.env.{APP_ENV}.local | APP_ENV が設定されているとき | 無視 |
config/.env.{APP_ENV} (例: config/.env.test) | APP_ENV が設定されているとき | コミット |
config/.env.local | 常に | 無視 |
config/.env | 常に | 無視 |
プロジェクトルートの .env | 常に | 無視 |
APP_ENV は実際の環境変数から読み込まれます。vendor/bin/phpunit と bin/cake test はデフォルトで APP_ENV=test で動くので、テストでは config/.env.test が読み込まれます (テストの実行 を参照してください)。開発用の設定は config/.env に、自分のマシンだけで使う上書きは config/.env.local や config/.env.test.local に書きます。
| 変数 | 設定 | デフォルト |
|---|---|---|
DEBUG | debug (0、1、2、true = 2、false = 0) | 2 |
SECURITY_SALT | Security.salt | config/core.php の値 |
SECURITY_CIPHER_SEED | Security.cipherSeed (1〜4294967295。レガシーな 'cipher' Cookie でのみ使用) | config/core.php の値 |
COOKIE_KEY | Cookie.key。'aes' タイプでの CookieComponent のキー (2.12.6 からコンポーネントが読み込みます) | null (Security.salt が使われます) |
DATABASE_URL | config/database.php の default 接続と test 接続 (DSN) | config/database.php の値 |
MAILER_DSN | config/email.php の default プロファイルのトランスポート (Symfony Mailer の DSN) | config/email.php の値 |
- 設定されていない変数や空の変数ではデフォルトが使われるので、
.envファイルがなければアプリケーションは これまでとまったく同じように動作します。 .envファイルの値は引用符で囲んでください (例:DEBUG="0")。引用符で囲まない数値はパーサーによって 正規化されます (007は7になり、cipher seed のような長い数字の列はオーバーフローします)。.envファイルは開発用です。本番環境では、代わりに実際の環境変数を設定してください。DATABASE_URLはconfig/database.php.defaultが、MAILER_DSNはconfig/email.php.defaultが 読み込みます。以前のスケルトンからconfig/database.phpやconfig/email.phpを作成した場合は、__construct()メソッドをそこにコピーしてください (以前のDB_*変数用のapplyEnv()メソッドと以前のAPP_ENVの分岐は削除します)。tests/bootstrap.php、bin/cake、webroot/test.phpのAPP_ENVの デフォルトもスケルトンからコピーしてください。
データベースとメーラーの DSN
DSN は、CakePHP 3.x 以降や Symfony と同じように、1 つの文字列で接続全体を設定します。config/database.php の接続と config/email.php のプロファイルの 'dsn' キーが DSN を受け取り、スケルトンはそれを Symfony の環境変数 (DATABASE_URL、MAILER_DSN) から設定します。
// config/database.php
$this->default['dsn'] = env('DATABASE_URL');
$this->test['dsn'] = env('DATABASE_URL');
// config/email.php
$this->default['dsn'] = env('MAILER_DSN');Symfony と同じように、データベースの変数は 1 つです。DATABASE_URL は現在の環境のデータベースで、 両方の接続がこれを使います。テスト (APP_ENV=test) では config/.env.test のテスト用データベースになります。
'dsn' キーには、pieceofcake2/cakephp 2.12.7 以降が必要です。それより前のリリースではこのキーは 無視され、ファイルのほかのキーが使われます。
# 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: three slashes for a path relative to the working directory, four for an absolute path
DATABASE_URL="sqlite:////var/db/my_app.sqlite"
# SQLite in memory (e.g. in config/.env.test.local)
DATABASE_URL="sqlite:///:memory:"
# SQL Server
DATABASE_URL="sqlserver://user:password@localhost:1433/my_app?encoding=utf8"
# SMTP with STARTTLS on port 587
MAILER_DSN="smtp://user:password@smtp.example.com:587"
# SMTP over SSL/TLS (port 465)
MAILER_DSN="smtps://user:password@smtp.example.com"
# Local SMTP server for development (e.g. Mailpit)
MAILER_DSN="smtp://localhost:1025"
# PHP mail()
MAILER_DSN="sendmail://default"
# Do not send (Debug transport)
MAILER_DSN="null://null"- スキームでデータソース (
mysql、postgres、sqlite、sqlserver) やトランスポート (Smtpにはsmtp/smtps、Mailにはsendmail/native、Debugにはnull) が決まります。 - クエリパラメーターでほかのキーを設定します。データベースでは
encoding、schema、prefix、persistent=true、flags[1002]=...、SMTP ではtimeout、client、tls=1などです。 - パスワードの予約文字はエンコードしてください。
@は%40、?は%3F、#は%23、%は%25です。 たとえばp@ss?はp%40ss%3Fになります。 - DSN にあるキーは
config/database.phpやconfig/email.phpの同じキーを置き換え、ほかのキーはそのまま残ります。 スケルトンのファイルのキーはデフォルト値です。パスワードのない DSN (mysql://root@localhost/my_app) では ファイルの'password' => 'password'が残るので、空のパスワードにはmysql://root:@localhost/my_appと書きます。 - 設定されていない変数や空の変数は無視され、ファイルのキーが使われます。
- プラグインは、ブートストラップで
CakeEmail::setDsnClassMap()やConnectionManager::setDsnClassMap()を使って スキーム (たとえば Amazon SES プラグインのses+api://) を追加できます。 - すべての規則は、本の データソース と CakeEmail をご覧ください。
Docker と CI
DSN は環境変数として渡します。Docker Compose では次のようにします。
services:
app:
environment:
DATABASE_URL: "mysql://my_app:secret@db:3306/my_app?encoding=utf8mb4"
MAILER_DSN: "smtp://mailpit:1025"
db:
image: mysql:8.4
environment:
MYSQL_DATABASE: my_app
MYSQL_USER: my_app
MYSQL_PASSWORD: secret
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
mailpit:
image: axllent/mailpitGitHub Actions では、テストのステップで DATABASE_URL にテスト用データベースを設定します。実際の環境変数は config/.env.test より優先されます。
- name: Run tests
env:
DATABASE_URL: mysql://root:root@127.0.0.1:3306/test_app?encoding=utf8mb4
run: |
cp config/database.php.default config/database.php
vendor/bin/phpunitセキュリティ用のソルトの生成
Security.salt と Security.cipherSeed は、暗号論的に安全な乱数生成器で生成してください。 以下のコマンドは、Linux と macOS のどの POSIX シェルでも動作します (cipher seed はレガシーな 'cipher' Cookie のタイプでしか使いません。cipherSeed と 'cipher' Cookie タイプ をご覧ください):
# SECURITY_SALT: 64 hexadecimal characters
php -r 'echo bin2hex(random_bytes(32)), PHP_EOL;'
openssl rand -hex 32 # without PHP
# SECURITY_CIPHER_SEED: a number from 1 to 4294967295
php -r 'echo random_int(1, 4294967295), PHP_EOL;'
od -An -N4 -tu4 /dev/urandom | tr -dc 0-9; echo # without PHPconfig/.env.example をコピーした後で、両方を config/.env に追記するには次のようにします (同じ変数が 2 回設定されている場合は、後の行が有効になります):
php -r 'printf("SECURITY_SALT=\"%s\"\nSECURITY_CIPHER_SEED=\"%d\"\n", bin2hex(random_bytes(32)), random_int(1, 4294967295));' >> config/.envPHP を使わない場合は次のとおりです。
printf 'SECURITY_SALT="%s"\nSECURITY_CIPHER_SEED="%s"\n' "$(openssl rand -hex 32)" "$(od -An -N4 -tu4 /dev/urandom | tr -dc 0-9)" >> config/.env- ソルトは 32 文字以上にしてください。ソルトは
CookieComponentのデフォルトのキーで、'aes'Cookie の タイプはそれより短いキーを受け付けません。 - これより長い cipher seed は使わないでください。意味があるのは 1〜4294967295 だけです (後述)。
- 環境ごとに異なる値を使い、コミットしないでください。本番環境では、実際の環境変数を設定してください。
- 後から
Security.saltを変更すると、ユーザーはログアウトされ、開いているフォームは無効になり、 暗号化された Cookie は読めなくなります。また、HMAC ソルトを明示せずにSecurity::encrypt()で暗号化した データと、SimplePasswordHasherでハッシュ化したパスワードも使えなくなります (bcrypt のハッシュは影響を 受けません)。Security.cipherSeedを変更して使えなくなるのは、デフォルトの'cipher'タイプの Cookie など、Security::cipher()で暗号化した値だけです。
詳しい内容と、値を安全に入れ替える方法については、クックブックの セキュリティ用のソルトの生成 をご覧ください。
cipherSeed と 'cipher' Cookie タイプ
Security.cipherSeed を使うのは Security::cipher()、つまり CookieComponent の暗号化タイプ 'cipher' だけです。 これはデフォルトのタイプで、安全ではありません。
Security::cipher()はmt_srand((int)(float)$seed)を呼び出すので、意味があるのは 1〜4294967295 だけです。 27 桁以上の値と、26 桁の値の約 95% は、シード0になります。本家の CakePHP 2 とこのスケルトンの以前の バージョンのconfig/core.phpにある 29 桁のデフォルト値、ブログチュートリアルの例、そして以前のバージョンのconfig/.env.exampleにあったコマンドで生成した値も、これに当てはまります。現在のconfig/core.phpの フォールバックは範囲内のサンプル値ですが、それでも置き換えてください。- 範囲内のシードにしても
'cipher'は安全になりません。シードは約 43 億通りしかなく、キーストリームは 暗号用ではない Mersenne Twister の XOR なので、総当たりで破れます。 - シードを変更すると、既存の
'cipher'Cookie は読めなくなります。
代わりに、32 バイト以上のランダムな専用のキーと 'aes' タイプを使い、Security.useOpenSsl が true であることを 確認してください。スケルトンは config/core.php でこれを設定しています。設定しないと、Security::encrypt()/decrypt() は PHP 8 には存在しない mcrypt を呼び出し、'aes' Cookie は失敗します (OpenSSL を有効にする を参照)。
pieceofcake2/cakephp 2.12.6 からは、Cookie.type と Cookie.key を設定で指定できます。
2.12.6 以降: config/core.php がソルトの隣で両方をすでに設定しているので、コントローラーを変更する必要はありません。
Configure::write('Cookie.type', 'aes');
Configure::write('Cookie.key', env('COOKIE_KEY') ?: null);CookieComponent は、明示的な 'type'/'key' の設定 (または type() と $this->Cookie->key) を最初に使い、 次に Cookie.type/Cookie.key、最後に 'cipher' と Security.salt を使います。
2.12.5 以前: CookieComponent は Cookie.type と Cookie.key を読み込まないので、上の行は効果がありません。 スケルトンは CookieComponent を使っていません。Cookie を追加するときは、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 のキーはデフォルトのキーを置き換えてしまい、暗号化が失敗します。 このコードは 2.12.6 以降でもそのまま動作します。
'aes' タイプには 32 バイト以上のキーが必要です。COOKIE_KEY が設定されていないと、Cookie.key は null になり、 キーには Security.salt が使われます。ソルトが 32 バイトより短いと、暗号化された Cookie の書き込みや読み込みで CakeException が投げられます。
キーは php -r 'echo bin2hex(random_bytes(32)), PHP_EOL;' または openssl rand -hex 32 で生成し、 config/.env の COOKIE_KEY に設定してください (本番環境では実際の環境変数として設定します)。 既存のアプリケーションを 'cipher' から 'aes' に切り替えると、既存の Cookie の値 (たとえば、ログイン状態を保持する remember-me) は一度失われます。影響、アプリケーションに合った選択肢、移行の手順については、クックブックの cipherSeed と Cookie の 'cipher' タイプ をご覧ください。
アプリケーションの実行
開発時は、次のコマンドで PHP のビルトイン Web サーバーを起動します。
bin/cake serverそして http://localhost:8765/ を開きます。別のポートを使うには --port (-p) を指定します。
本番環境では、Web サーバーのドキュメントルートを webroot/ に向けてください。config/、logs/、tmp/、vendor/ と .env ファイルを含むプロジェクトディレクトリに向けてはいけません。webroot/.htaccess ファイルは、 mod_rewrite を使う Apache のためにリクエストを index.php に書き換えます。Apache と nginx の例については、クックブックの Web サーバーの設定 をご覧ください。
ページとスタイル
レイアウト、ホームページ、エラーページ、フラッシュメッセージは CakePHP 5 のアプリケーションスケルトン から移植したもので、 webroot/css/ にあるそのスタイルシートを使います:
| ファイル | 説明 |
|---|---|
normalize.min.css | normalize.css 8.0.1 |
milligram.min.css | Milligram 1.4.1 |
fonts.css | webroot/font/ から配信する Raleway フォント (フォントサービスへのリクエストはありません) |
cake.css | アプリケーションのスタイル: レイアウト、フラッシュメッセージ、フォーム、テーブル、ページネーター、エラーページ、デバッグ出力 |
home.css | ホームページだけのスタイル |
cake.generic.css | 以前のスケルトンのスタイルシート。テンプレートはもう読み込みませんが、そのクラスを使っているビュー (たとえば legacy bake テーマで bake したビュー) のために残してあり、コアのフォールバック用レイアウトが読み込みます |
テンプレート:
templates/Layouts/default.ctp: 上部のナビゲーションバーとコンテンツのコンテナ。debugが 2 の間は、 コンテンツの下に SQL ログが表示されます。templates/Layouts/error.ctp: 本番環境のエラーページ用の最小限のレイアウト。templates/Layouts/flash.ctp:Controller::flash()が描画するページ。templates/Elements/Flash/:default、success、error、warning、infoのフラッシュメッセージ ($this->Flash->success('Saved.')など)。メッセージはエスケープされます。HTML を出力するには['params' => ['escape' => false]]を渡します。メッセージをクリックすると非表示になります。
pieceofcake2/bake で bake したビューも同じスタイルを使います。
ホームページ
templates/Pages/home.ctp は、debug が有効な間 / に表示されます。このページはアプリケーションの環境をチェックします。 PHP のバージョンと拡張 (mbstring、intl、openssl、PDO と default データソースのドライバー)、tmp/ と logs/ ディレクトリ、キャッシュ、データベース接続 (失敗した場合はエラーメッセージも)、config/.env、セキュリティ用のソルトと cipher seed、そして DebugKit プラグインと Bake プラグインです。本番環境では NotFoundException を投げるので、 debug を無効にする前に独自のページに置き換えてください。

スマートフォンでの表示:

エラーページ
debug が 0 のとき、templates/Errors/error400.ctp と error500.ctp は error レイアウトで短いメッセージを 表示します。


デバッグモードでは、CakePHP の他のエラーページと同じように、デフォルトのレイアウトを使ってスタックトレースを表示します。
フラッシュメッセージ

既存のアプリケーション
以前のバージョンのスケルトンから作成したアプリケーションは影響を受けません。テンプレートと webroot/css/ は アプリケーション自身のものだからです。新しい見た目を使うには、templates/Layouts/、templates/Elements/Flash/、 templates/Errors/、webroot/css/、webroot/font/ と webroot/img/cake.logo.svg をアプリケーションに コピーしてください。cake.generic.css 向けに bake したビューは、bake し直す (またはスタイルを直す) 必要があります。 bake したビューと legacy テーマ をご覧ください。
開発
テストの実行
テストケースは tests/TestCase/ に、フィクスチャは tests/Fixture/ に置きます。vendor/bin/phpunit と bin/cake test は、デフォルトで APP_ENV=test で動きます。APP_ENV が設定されていなければ、CakePHP が .env ファイルを読み込む前に tests/bootstrap.php と bin/cake がこれを設定します (ブラウザーのテスト ランナー webroot/test.php も同じです)。そのため、テストではコミットされている config/.env.test が 読み込まれます。このファイルは DATABASE_URL をテスト用データベースに設定し (MAILER_DSN は null://null です)、default 接続と test 接続の両方がこれを使います。自分のテスト用データベースは、config/.env.test.local (Git では 無視されます) か、CI と同じように config/.env.test より優先される実際の環境変数で設定してください。
# config/.env.test.local
DATABASE_URL="mysql://root:secret@127.0.0.1:3306/my_app_test?encoding=utf8mb4"開発用の DATABASE_URL は config/.env に置いたままにします。config/.env.test と config/.env.test.local が先に読み込まれ、優先されます。実際の環境変数はファイルより優先されるので、テストを実行するシェルで 開発用の DATABASE_URL やほかの APP_ENV を export しないでください。フィクスチャはテーブルを削除して 作成します。
それから PHPUnit でテストを実行します。
vendor/bin/phpunitテストシェルで 1 つのテストケースだけを実行することもできます。
bin/cake test app Controller/PostsControllerphpunit.xml.dist には 2 つのテストスイートがあります:
| スイート | ディレクトリ | 実行方法 |
|---|---|---|
App | tests/TestCase/ (EndToEnd/ を除く) | vendor/bin/phpunit (デフォルトのスイート) |
EndToEnd | tests/TestCase/EndToEnd/ | vendor/bin/phpunit --testsuite EndToEnd |
vendor/bin/phpunit --testsuite App,EndToEnd は両方を実行します。phpunit.xml.dist の defaultTestSuite="App" により、vendor/bin/phpunit は速く、ブラウザーなしで実行できます。Symfony アプリケーションのように vendor/bin/phpunit ですべてを実行するには、この属性を 1 つ削除してください。
End-to-End テスト
tests/TestCase/EndToEnd/ は、pieceofcake2/panther (Markdown) を使ったブラウザーの End-to-End テストのためのディレクトリです。pieceofcake2/panther は Symfony Panther と同じ方法でテストを実行します。 アプリケーションを PHP のビルトイン Web サーバーで起動し、ヘッドレス Chrome で操作します。使い方は次のとおりです:
パッケージと、使っている Chrome に合った chromedriver をインストールします。
bashcomposer require --dev "pieceofcake2/panther:^1.0.1" dbrekelmans/bdi vendor/bin/bdi detect driversphpunit.xml.distのServerExtensionのコメントを外します。この拡張は、実行全体を通して Web サーバーと ブラウザーを動かし続けます。End-to-End テストが実行されるまでは何も起動しません。tests/TestCase/EndToEnd/にPieceOfCake2\Panther\TestSuite\PantherTestCaseを継承したテストを書き、vendor/bin/phpunit --testsuite EndToEndで実行します。
Panther が起動する Web サーバーは、APP_ENV=test を含む PHPUnit の環境を引き継ぎます。 そのため Web サーバーも config/.env.test を読み込み、ページが使う default 接続 (DATABASE_URL) がテスト用 データベースになるので、ページはテストのフィクスチャを読み込みます。ほかの設定は必要ありません。Panther の PANTHER_APP_ENV が必要になるのは、Web サーバーにテストとは異なる APP_ENV を渡すときだけです。
これらのテストは Panther の PANTHER_* 変数で設定します。phpunit.xml.dist は、失敗したテストの スクリーンショット用に PANTHER_ERROR_SCREENSHOT_DIR=./tmp/error-screenshots を設定しています。
PANTHER_NO_HEADLESS=1 (ブラウザーの動きを見るため) のようなマシンごとの値は、シェルか、phpunit.xml.dist を コピーした phpunit.xml で設定してください。CI では、End-to-End テストを別のジョブで実行してください。変数、 テスト用データベース、GitHub Actions の例については panther のドキュメントをご覧ください。
コーディング規約
CakePHP のコーディング規約に沿っているかコードをチェックします。
vendor/bin/phpcs静的解析
src/ と config/ に対して PHPStan (レベル 5) を実行します。
vendor/bin/phpstan analyse設定は phpstan.neon にあり、 pieceofcake2/phpstan-cakephp2 拡張を使います。
由来
このパッケージは cakephp/cakephp (Packagist では cakephp/cakephp、アップストリームの最終バージョンは 2.10.24) の app/ ディレクトリをもとに別のパッケージとして切り出したもので、 元の作者は CakePHP コミュニティ (Cake Software Foundation, Inc.) です。 pieceofcake2 が、モダンな PHP で動く CakePHP 2 向けに メンテナンスしています。オリジナルからの変更点は コミット履歴 で確認できます。
