4.1 移行ガイド
CakePHP 4.1 は 4.0 からのAPI互換アップグレードです。 このページでは、4.1で追加された非推奨事項と機能の概要を説明します。
4.1.0へのアップグレード
CakePHP 4.1.0にアップグレードするには、次の Composer コマンドを実行してください。:
php composer.phar require --update-with-dependencies "cakephp/cakephp:4.1.x"
非推奨
4.1では、いくつかの非推奨機能が導入されています。 これらの機能はすべて 4.x の間は継続されますが、5.0 で削除されます。 非推奨機能の更新を自動化するには、`upgrade tool <upgrade-tool-use>` を使用します。:
text
bin/cake upgrade rector --rules cakephp41 <path/to/app/src>NOTE
これはCakePHP 4.1の変更点のみを更新します。CakePHP 4.0の変更を最初に適用していることを確認してください。
Controller
PaginatorComponentのsortWhitelistオプションは非推奨になりました。 代わりに、sortableFieldsを使用してください。PaginatorComponentのwhitelistオプションは非推奨になりました。 代わりに、allowedParametersを使用してください。
Database
TableSchema::getPrimary()は非推奨になりました。 代わりに、getPrimaryKey()を使用してください。Cake\Database\Schema\BaseSchemaはCake\Database\Schema\SchemaDialectに名前が変更されました。Cake\Database\Schema\MysqlSchemaはCake\Database\Schema\MysqlSchemaDialectに名前が変更されました。Cake\Database\Schema\SqliteSchemaはCake\Database\Schema\SqliteSchemaDialectに名前が変更されました。Cake\Database\Schema\SqlserverSchemaはCake\Database\Schema\SqlserverSchemaDialectに名前が変更されました。Cake\Database\Schema\PostgresSchemaはCake\Database\Schema\PostgresSchemaDialectに名前が変更され、内部マークされました。DateTimeType::setTimezone()は非推奨になりました。 代わりに、setDatabaseTimezone()を使用してください。FunctionBuilder::cast([...])に対するマジックメソッド署名は非推奨になりました。 代わりに、FunctionBuilder::cast('field', 'type')を使用してください。Cake\Database\Expression\ComparisonはCake\Database\Expression\ComparisonExpressionに名前が変更されました。
Datasource
PaginatorのsortWhitelistオプションは非推奨になりました。 代わりに、sortableFieldsを使用してください。Paginatorのwhitelistオプションは非推奨になりました。 代わりに、allowedParametersを使用してください。
Form
Form::schema()は非推奨になりました。 代わりに、Form::getSchema()かForm::setSchema()を使用してください。
Http
CsrfProtectionMiddleware::whitelistCallback()は非推奨になりました。 代わりに、skipCheckCallback()を使用してください。ServerRequest::input()は非推奨になりました。 PHP の生の入力を文字列として取得するには、(string)$request->getBody()を使用してください。BodyParserMiddlewareを使ってリクエストのボディを解析してください。そうすれば、$request->getParsedBody()で配列やオブジェクトとして利用できるようにします。- フレームワーク内でのクッキー作成との一貫性を高めるために、
CsrfProtectionMiddlewareのhttpOnlyオプションは、httponlyに変更されました。
ORM
QueryExpression::or_()とQueryExpression::and_()は非推奨になりました。 代わりにor()とand()を使用してください。
Routing
Cake\Routing\Exception\RedirectExceptionは非推奨になりました。 代わりに、Cake\Http\Exception\RedirectExceptionを使用してください。
View
Form/ContextInterface::primaryKey()は非推奨になりました。 代わりに、getPrimaryKey()を使用してください。
Behaviorの変更
以下の変更はどのメソッドの署名も変更しませんが、メソッドのセマンティクスや動作を変更します。
Database
- MySQL: (未だにブーリアン型にマップされている)
TINYINT(1)以外の整数の表示幅は無視されるようになりました。 MySQL 8では表示幅は非推奨です。
Http
- アップロードしたファイルの正規化は、
ServerRequestからServerRequestFactoryに移動されました。 これは、ネストされたファイルアップロード配列を使用するリクエストオブジェクトを作成している場合、 テストに影響を与える可能性があります。IntegrationTestCaseTraitを使ったテストは変更する必要はありません。
ORM
Cake\ORM\TableRegistryは非推奨になりました。 テーブルロケーターインスタンスを取得するためには、 代わりにCake\ORM\Locator\LocatorAwareTrait::getTableLocator()かCake\Datasource\FactoryLocator::get('Table')を使用してください。Controller,Command,TestCaseのようなクラスは、 すでにCake\ORMLocator\LocatorAwareTraitを使用しています。 そのため、これらのクラスでは$this->getTableLocator()->get('ModelName')を使うことができます。- BelongsToMany アソシエーションは、ジャンクションテーブルの BelongsTo アソシエーションで設定された bindingKey を尊重するようになりました。 以前は、ターゲットテーブルの主キーが常に代わりに使用されていました。
- アソシエーション名が適切に大文字と小文字を区別するようになりました。 そのため、
Query::contain()やTable::hasMany()のような関数で参照する際には、適切にマッチさせなければなりません。 Cake\ORM\AssociationCollectionは、内部で保持しているオブジェクトマップのキーを生成するために、 アソシエーション名を小文字にしなくなりました。
TestSuite
TestCase::setAppNamespace()は、保存と復元が簡単になるように、以前のアプリの名前空間を返すようになりました。- MySQL予約キーワードの変更に伴い、GroupsFixtureの名前がSectionsFixtureに変更されました。
View
- フォームヘルパーのデフォルトの値のソースが
contextの代わりにdata, contextに設定されるようになりました。 もしsetValueSources()を使って値のソースを変更する場合は、コードを更新する必要があるかもしれません。 - CakePHPで提供されている
FormHelperコンテキストクラスは、コンストラクタに$requestオブジェクトを取らなくなりました。
新機能
Datasource
EntityInterface::getAccessible()が追加されました。
Console
- 環境変数
NO_COLORが設定されている場合、すべての出力に色の ANSI エスケープコードは含まれません。 詳しくは no-color.org を参照してください。 - コマンドはシェルが
$io->setInteractivate(false)を使っていたのと同じように対話モードを無効にすることができるようになりました。 これは、必要に応じてプロンプトを回避し、デフォルト値を使用します。--quiet/-qを使うことで、既存のすべてのコマンドに対して直接呼び出すことができるようになりました。
Database
- MySQL 8 がサポートされました。テストも行われています。
- SQL関数の集約を表現するために
AggregateExpressionを追加しました。FunctionsBuilder::aggregate()は新しい集約SQL関数をラップするのに使えます。 - 任意の集約式にウィンドウ関数のサポートが追加されました。
AggregateExpressionはウィンドウ式をラップしたため、連鎖的な呼び出しによって任意のインスタンスを簡単に拡張することができます。 - 集約関数が
FILTER (WHERE ...)区をサポートしました。 - PostgreSQL と SQLServer は エイリアスを持つ集約関数に対して
HAVING条件をサポートするようになりました。 FunctionsBuilder::cast()が追加されました。- Common Table Expression (CTE) が追加されました。 CTEは、`Query::with()` を用いてクエリにアタッチすることが可能です。
Query::orderAsc()とQuery::orderDesc()はClosureをフィールドとして受け付けるようになり、 提供されているQueryExpressionオブジェクトを使って複雑なオーダー式を構築できるようになりました。
Error
- ウェブコンテキストではHTMLを、CLIコンテキストではANSIスタイルで出力するようになりました。 周期的な構造や繰り返しオブジェクトの出力がよりシンプルになりました。 周期的なオブジェクトは一度だけダンプされ、完全な値に戻るために参照 ID を使用します。
Debugger::addEditor()とDebugger::setEditor()が追加されました。 これらのメソッドにより、エディタのフォーマットを追加したり、好みのエディタを設定したりすることができます。- 設定値として
Debugger.editorが追加されました。この値は、優先されるエディタのリンク形式として使用されます。 ErrorHandlerMiddlewareはHttp\Exception\RedirectExceptionをハンドルするようになり、 それらの例外を HTTP リダイレクトレスポンスに変換するようになりました。BaseErrorHandlerは設定されたエラーロガーを使ってPHPの警告やエラーをログに記録するようになりました。- カスタムエラーロガーに必要なインターフェイスを正式なものにするために
ErrorLoggerInterfaceが追加されました。
Form
Form::set()を追加しました。 このメソッドはView::set()やController::set()と同じようにフォームオブジェクトにデータを追加することができます。
Http
BaseApplication::addOptionalPlugin()を追加しました。 このメソッドは、プラグインの読み込みや、開発者依存のため存在しない可能性のあるプラグインのエラー処理を行います。Cake\HttpException\RedirectExceptionを追加しました。 この例外は Routing パッケージのRedirectExceptionを置き換えるもので、 アプリケーションのどこでも発生させることができます。CsrfProtectionMiddlewareはsamesite属性を設定したクッキーを作成することができるようになりました。Session::read()が2番目のパラメータでデフォルト値を設定できるようになりました。Session::readOrFail()は、キーが見つからなかった場合に例外を発生させたい場合に便利なread()操作のラッパーとして追加されました。
I18n
Time,FrozenTime,Date,FrozenDateのsetJsonEncodeFormatメソッドは、 カスタムの文字列を返すための callable を受け入れるようになりました。parseDateTime()とparseDate()は、disableLenientParsing()を使用して、簡潔な構文解析を無効にすることができます。 デフォルトでは有効になっています。(IntlDateFormatter と同様です)
Log
- ログメッセージに
{foo}スタイルのプレースホルダを含めることができるようになりました。 これらのプレースホルダは$contextパラメータの値に置き換えられます。
ORM
- ORMはリクエストデータから各エンティティがマージされた後に
Model.afterMarshalイベントをトリガーするようになりました。 TranslateBehaviorを使用しているときに、localefinderオプションを使用して、 単一の検索呼び出しのロケールを変更することができます。Query::clearResult()が追加されました。 このメソッドを使うと、クエリの結果を削除して再実行できるようになります。Table::delete()は、cascadeCallbackの操作中に依存するアソシエーションが削除に失敗した場合、 削除操作を中止してfalseを返すようになりました。Table::saveMany()は保存されたエンティティに対してModel.afterSaveCommitイベントを起動するようになりました。
Routing
- ルートパス文字列からURL配列を素早く生成するための便利な関数
urlArray()が導入されました。
TestSuite
FixtureManager::unload()は、フィクスチャがアンロードされている間、 テストの end でテーブルを切り詰めることはなくなりました。 テーブルはフィクスチャのセットアップ中にも切り捨てられます。 切り捨て処理が少なくなったため、テストスイートの実行がより速くなるはずです。- メールボディアサーションは、失敗メッセージにメールの内容を含めるようになり、 テストのデバッグがより簡単になりました。
- チェーン可能なフィクスチャ設定を可能にするために、
TestCase::addFixture()が追加されました。 これは、IDEでも自動補完可能です。
View
TextHelper::::slug()を追加しました。 このメソッドは、Cake\Utility\Text::slug()を委譲します。- ヘルパーを追加するためのチェイン可能なラッパーメソッドとして
ViewBuilder::addHelper()を追加しました。 - ルートパスからのリンクやURLをより簡単に作成するために、ビュー層でIDEをサポートした
HtmlHelper::linkFromPath()とUrlHelper::urlFromPath()を追加しました。
Utility
Hash::combine()は$keyPathパラメータにnullを指定できるようになりました。 nullを指定すると、数値インデックス付きの出力配列になります。