CakePHP 3.2.0 がリリースされました

CakePHPコアチームはCakePHP 3.2.0が入手可能になったことをお知らせいたします。これは3.2系の最初の安定版のリリースです。3.1系はセキュリティアップデートのみの適用となります。3.2は3.1や3.0と後方互換性があります。また、新機能やパフォーマンス改善を提供します。

動作要件:PHP 5.5 以上

CakePHP 3.2 は PHP 5.5.9 以上で動作します。PHP 5.5対応により、改善されたDateやTimeライブラリを提供し、パスワード互換ライブラリとの依存を解除できます。

非推奨の警告の停止

アップグレードすると、いくつかの廃止予定の警告が表示されることがあります。 これらの警告は、CakePHP 4.xで削除されるメソッド、オプション、および機能によって生成されますが、3.xの存続期間中は引き続き存在します。 推奨されていない機能の問題がある場合は対処することをおすすめしますが、いつでもそうできるとは限りません。非推奨通知の修正を延期する場合は、 config / app.php で無効にすることができます。

'Error' => [
    'errorLevel' => E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED,
]

上記のエラーレベルでCakePHPからの非推奨の警告を抑制できます。

Carbon を Chronos に置き換え

Carbon ライブラリは cakephp/chronos に置き換えられました。この新しいライブラリは Carbon のフォークで、依存性はありません。また、カレンダーの日付オブジェクト、dateオブジェクトとdatetimeオブジェクトも提供しています。

新しい日付オブジェクト

Dateクラスを使用すると、きれいにPHPオブジェクトにDATE列をマッピングすることができます。 日付インスタンスは、常に時刻を00:00:00 UTCに固定します。 既定では、DATE列をマッピングするときにORMによってDateのインスタンスが作成されます。

新しい不変の日付と時刻オブジェクト

FrozenTimeクラスとFrozenDateクラスが追加されました。これらのクラスは、Timeオブジェクトと同じAPIを提供します。Frozenクラスは、変更不可の時間と日付のバリアントを提供します。 不変オブジェクトを使用することで、誤った突然変異を防ぐことができます。 インプレース変更の代わりに、修飾子メソッドは新しいインスタンスを返します。

use Cake\I18n\FrozenTime;
$time = new FrozenTime('2016-01-01 12:23:32');
$newTime = $time->modify('+1 day');

上記のコードでは、$time と $newTime は異なるオブジェクトです。 $time オブジェクトは元の値を保持し、$newTime は変更された値を保持します。3.2以降、ORMはdate/datetime列を不変オブジェクトにマップすることもできます。

CorsBuilder の追加

Cross Origin Requests(CORS)に関連する設定ヘッダーを簡単にするために、新しいCorsBuilderが追加されました。 このクラスを使用すると、流暢なインターフェイスでCORS関連のヘッダーを定義できます。

RedirectRoute はリダイレクト時に例外を送出する

Router::redirect()は、リダイレクト条件に達すると、Cake\Network\Routing\RedirectExceptionを送出するようになりました。この例外はルーティングフィルタによって捕捉され、レスポンスに変換されます。 これはresponse->send()の呼び出しを置き換え、ディスパッチャーフィルターがリダイレクトレスポンスと対話できるようにします。

ORM の改善

  • 同じアソシエーションを複数回含む場合も期待通りに機能し、クエリービルダー関数がスタックされるようになった。
  • 関数式は結果を正しくキャストするようになった。 つまり、$query->func()->current_date()のような式はdatetimeインスタンスを返す。
  • 検証に失敗したフィールドデータは、invalid()メソッドを介してエンティティでアクセスできるようになった。
  • エンティティ・アクセサ・メソッドの参照がキャッシュされ、パフォーマンスが改善された。

Validator API の改善

Validatorオブジェクトには、バリデータの構築をあまり冗長にしないようにする、新しいメソッドがたくさんあります。たとえば、ユーザー名フィールドにバリデーションルールを追加する場合は、次のようになります。

$validator->email('username')
    ->ascii('username')
    ->lengthBetween('username', [4, 8]);

Console の改善

  • Shell::info()Shell::warn()Shell::success()の追加。これらのヘルパーメソッドはよくつかわれるスタイリングを簡単に使用できるようにします。
  • Cake\Console\Exception\StopException の追加
  • error()に代わりShell::abort()の追加

StopException の追加

Shell::_ stop()Shell::error()はもはやexit()を呼び出しません。 代わりにCake\Console\Exception\StopExceptionを送出します。 これらのメソッドが呼び出されるシェル/タスクが\Exceptionをcatchしている場合、catchブロックはStopExceptionを捕捉しないように更新する必要があります。 exit()を呼び出すのをやめると、シェルをテストするのが簡単になり、必要なモック数が少なくてすみます。

ヘルパーの initialize()

ヘルパーは、他のクラス型と同様に initialize(array $config) フックメソッドを実装できるようになった。

FormHelper

FormHelper::create()で、actionキーは非推奨になりました。 urlキーを直接使用する必要があります。

致命的なエラー メモリリミット処理

メガバイト数を新しい構成オプションError.extraFatalErrorMemoryに設定して、致命的なエラーが発生したときにメモリの制限を増やすことができます。 これによりログ処理やエラー処理を行なう分のメモリを確保し、処理を完了することができます。

非推奨

CakePHPの改良を続けていくうえで、特定の機能はより良いソリューションに置き換えられるため、非推奨になります。 廃止予定の機能は4.0まで削除されません:

  • Shell::error()は非推奨になりました。その名前がメッセージを出力して実行を停止することを明確に示していないからです。 代わりにShell::abort()を使用してください。
  • Cake\Database\Expression\QueryExpression::type()は非推奨になりました。 代わりにtieWith()を使用してください。
  • Cake\Database\Type\DateTimeType::$dateTimeClassは非推奨になりました。 代わりにDateTimeType::useMutable()またはDateTimeType::useImmutable()を使用してください。
  • Cake\ORM\ResultSet::_calculateTypeMap()は使用されなくなり、廃止予定です。
  • Cake\ORM\ResultSet::_castValues()は使用されなくなり、廃止予定です。

3.3の開発が始まりました。ロードマップは未完成ですから、新機能や改善についてはIRCやgithubから送ってください。3.2.0のドキュメントはこちら、APIドキュメントはこちら

いつもながら、問題報告やプルリクエストにより、このリリースの実現を支えてくれたコミュニティの皆さんに感謝します。

github よりパッケージリリースのダウンロード