by lorenzo
改善のための奔走により、ベータ3からいくらかAPIを変更しました。先のバージョンで多くの欠点が見つかったバリデーションのサブシステム関連で特に多くの変更があります。3.0.0-rc1での変更点の概要は以下のとおりです:
バリデーションの改善
バリデーションプロセスは2つの段階に分かれています。最初の段階はユーザーが対面するタイプのバリデーションで、いつ、どこで実行するかという点を除けば先のリリース以降変更はありません。
先のバージョンでは、以下のように実行しました。
$article = $this->Articles->newEntity($this->request->data);
$this->Articles->save($article, ['validate' => 'myCustomValidatorName']);
しかし現在は、ユーザーが対面するタイプのバリデーションは保存時には実行されず、エンティティが作成された時点で実行されます。このため、newEntityメソッドもしくはpatchEntityメソッドにバリデーションオプションを渡す必要があります。
$article = $this->Articles->newEntity($this->request->data, [
'validate' => 'myCustomValidatorName'
]);
$this->Articles->save($article);
バリデーションに失敗したフィールドは結果エンティティにコピーされないことに注意してください。
バリデーションの第二段階は、「アプリケーションルール」と呼んでいるもので、エンティティの保存もしくは削除の段階で実行されます。カラムの一意性、引数、外部キー制約など、アプリケーションの整合性をチェックするためのステップです。
// UsersTable.php にて
public function buildRules(RulesChecker $rules) {
$rules->add($rules->isUnique('email'));
return $rules;
}
アプリケーションルールは状態機械、ワークフローの状態など、ビジネスロジックの制約を強化するためにも使用できます。
validate() メソッドと validateMany() メソッドは Table クラスから削除されました。
アプリケーションルールシステムについての情報はこちら(英語)でさらにご覧になれます。
新しいエラーページ
例外スタックトレースを含むエラーページは、読みやすくエラー箇所を特定しやすいように再デザインされました。新しい外観はRails’ better errors pluginにインスパイアされたものです。
新しい Bake プラグイン
cake bake コマンドはプラグインになりました。これにより、コードの成長を早くし、新しいコードジェネレータや設定オプションを導入できます。
bake 関連の重要な変更点は、テンプレートの描画にCakePHPのビューシステムを使用するようになったことです。これにより、Bake.beforeRender や Bake.afterRender イベントを使用して bake の出力にリスナーをアタッチすることが可能になりました。
さらに、テンプレートの構文は読みやすくなるよう変更されました。これまでに使用していた bake テンプレートがあるなら、erbスタイルのタグを使用するようにアップデートする必要があります。Bake プラグインを入手するには、以下を実行します:
composer require cakephp/bake=dev-master --dev
そして、アプリケーションの bootstrap_cli.php ファイルでロードします。
Plugin::load('Bake');
テーブル不要のフォーム
多数のご要望により、ORMテーブルやエンティティを使用せずにスキーマやバリデーションを定義できる新しいフォームオブジェクトを導入しました。
public function add()
{
$contact = new ContactForm();
if ($this->request->is('post')) {
if ($contact->execute($this->request->data)) {
$this->Flash->success('We will get back to you soon.');
return $this->redirect(['action' => 'add']);
}
$this->Flash->error('There was a problem submitting your form.');
}
$this->set('contact', $contact);
}
これについては、こちら(英語)でさらに情報を得られます。
PSR-2 の採用
わたしたちは最近、CakePHP とすべての公式プラグインで PSR-2 コーディングスタイル規約を採用しました。理由についてはこちらのブログ記事(英語)で読むことができます。
ORM 関連の改善
- Query::firstOrFail() の追加
- TranslateBehavior で、joinType の変更を許可
- Table::addAssociations() により、一度に複数のアソシエーションを追加できるように実装
- IS NOT 演算子のサポート
- アソシエーションの別名が同じ場合でも matching() と contain() が呼び出せるようになった
コード、ドキュメントやフィードバックにより CakePHP 3.0 に関わってくれる皆さんに感謝します。バグや荒削りな部分がありましたら、Github でチケットをオープンしてご協力ください。