4.0 移行ガイド
CakePHP 4.0 には、重大な変更が含まれており、3.x リリースとの後方互換性はありません。 4.0 にアップグレードする前に、最初に 3.8 にアップグレードし、すべての非推奨警告を解消してください。
4.0 にアップグレードする方法の段階的な手順については、 4.0 アップグレードガイド を参照してください。
非推奨機能の削除
3.8 から非推奨の警告を発していたすべてのメソッド、プロパティと機能が削除されました。
認証機能がスタンドアロンのプラグイン Authentication および Authorization に分割されました。 以前の RssHelper については、同様の機能を持つスタンドアロンの Feed plugin をご覧ください。
非推奨
以下は、非推奨メソッド、プロパティと動作の一覧です。 これらの機能は、 4.x でも引き続き機能し、 5.0.0 で削除されます。
Component
AuthComponentおよび関連するクラスは廃止され、 5.0.0 で削除されます。代わりに、 上記の認証および認可ライブラリを使用する必要があります。SecurityComponentは非推奨です。代わりに、フォーム改ざん保護のためにはFormProtectionComponentを使用し、requireSecure機能のためには Https Enforcer Middleware を使用してください。
Filesystem
- このパッケージは非推奨であり、 5.0 で削除されます。多くの設計上の問題があり、そして、 すでに多くの素晴らしいパッケージが存在する場合、この頻繁に使用されるパッケージを修正することに 努力する価値はありません。
ORM
Entity::isNew()をセッターとして使うことは非推奨です。代わりにsetNew()を使用してください。Entity::unsetProperty()は、他のメソッドに合わせてEntity::unset()に名前が変更されました。TableSchemaInterface::primaryKey()はTableSchemaInterface::getPrimaryKey()に名前が変更されました。
View
JsonViewの特別なビュー変数_serialize、_jsonOptionsおよび_jsonpは非推奨になりました。 代わりに、viewBuilder()->setOption($optionName, $optionValue)を、それらのオプションを設定するために使用してください。XmlViewの特別なビュー変数_serialize、_rootNodeおよび_xmlOptionsは非推奨になりました。 代わりに、viewBuilder()->setOption($optionName, $optionValue)を、それらのオプションを設定するために使用してください。HtmlHelper::tableHeaders()は、ネストされたリストとして定義される属性を持つヘッダーセルを優先するようになりました。 例:['Title', ['class' => 'special']]ContextInterface::primaryKey()はContextInterface::getPrimaryKey()に名前が変更されました。
Mailer
Cake\Mailer\Emailクラスは非推奨になります。代わりに、Cake\Mailer\Mailerを使用してください。
App
App::path()はクラスパスでは非推奨になりました。 代わりに\Cake\Core\App::classPath()を使用してください。
破壊的変更
非推奨機能の削除に加えて、破壊的変更が行われました。
Cache
Cake\Cache\CacheEngine::gc()と、このメソッドのすべての実装が削除されました。 このメソッドは、ほとんどのキャッシュドライバーでノーオペレーションであり、ファイルキャッシュでのみ使用されていました。
Controller
Cake\Controller\Controller::referer()は、デフォルトでlocalパラメーターを、 false ではなく true に設定します。 これにより、デフォルトでアプリケーションのドメインに制限されるため、リファラルヘッダーの使用がより安全になります。- アクションの呼び出し時のコントローラーメソッド名のマッチングで、大文字と小文字が区別されるようになりました。 たとえば、コントローラーメソッドが
forgotPassword()の場合、 URL で文字列forgotpasswordを使用すると、アクション名としてマッチしません。
Console
ConsoleIo::styles()はgetStyle()およびsetStyle()に分割されました。これはConsoleOutputにも影響します。
Component
Cake\Controller\Component\RequestHandlerComponentは、リクエストパラメーターではなくリクエスト属性として、isAjaxを設定するようになりました。したがって、$request->getParam('isAjax')の代わりに$request->getAttribute('isAjax')を使用する必要があります。RequestHandlerComponentの入力データ解析機能は削除され。 代わりに、 Body Parser Middleware を使用する必要があります。Cake\Controller\Component\PaginatorComponentは、リクエストパラメーターではなくリクエスト属性として、 ページングパラメーター情報を設定するようになりました。したがって、$request->getParam('paging')の代わりに、$request->getAttribute('paging')を使用する必要があります。
Database
Cake\Database\TypeInterfaceの型マッピングクラスはTypeを継承しなくなり、BatchCastingInterface機能を活用します。Cake\Database\Type::map()は、セッターとしてのみ機能します。 型インスタンスを検査するにはType::getMap()を使用する必要があります。Date 、 Time 、 Timestamp および Datetime カラムタイプは、デフォルトで不変の時刻オブジェクトを返すようになりました。
BoolTypeは、空でない文字列値をtrueにマーシャリングしたり、空文字列をfalseにマーシャリングしなくなりました。代わりに、非ブール文字列値はnullに変換されます。DecimalTypeは、浮動小数ではなく文字列を使用して 10 進数値を表すようになりました。 浮動小数を使用することで、精度が低下していました。JsonTypeは、データベースコンテキストの値を準備するときにnullを保持するようになりました。 3.x では、'null'を出力します。StringTypeは、配列値を、空文字列の代わりにnullにマーシャリングします。Cake\Database\Connection::setLogger()は ロギングを無効化するためにnullを受け入れなくなりました。 代わりに、Psr\Log\NullLoggerのインスタンスを渡して、ロギングを無効にします。Database\Log\LoggingStatement、Database\QueryLoggerおよびDatabase\Log\LoggedQueryの内部実装が変更されました。これらのクラスを拡張する場合は、コードを更新する必要があります。Cake\Database\Log\LoggingStatement、Cake\Database\QueryLoggerおよびCake\Database\Log\LoggedQueryの内部実装が変更されました。これらのクラスを拡張する場合は、コードを更新する必要があります。Cake\Database\Schema\CacheCollectionおよびCake\Database\SchemaCacheの内部実装が変更されました。 これらのクラスを拡張する場合は、コードを更新する必要があります。データべーススキーマは、
CHARカラムをstringではなく、新しいchar型にマッピングするようになりました。SqlServer の datetime カラムは、名前を一致させるために 'timestamp' ではなく 'datetime' 型にマップされるようになりました。
MySQL 、 PostgreSQL および SqlServer のデータベーススキーマは、少数秒をサポートするカラムを、 新しい抽象少数型にマップするようになりました。
- MySQL
DATETIME(1-6)=>datetimefractionalTIMESTAMP(1-6)=>timestampfractional
- PostgreSQL
TIMESTAMP=>timestampfractionalTIMESTAMP(1-6)=>timestampfractional
- SqlServer
DATETIME2=>datetimefractionalDATETIME2(1-7) =>datetimefractional``
- MySQL
PostgreSQL のスキーマは、タイムゾーンをサポートするカラムを、新しい抽象タイムゾーン型にマップするようになりました。 0) 精度を指定しても、上記の通常の分数型の場合のように、型マッピングは変更されません。
- PostgreSQL
TIMESTAMPTZ=>timestamptimezoneTIMESTAMPTZ(0-6)=>timestamptimezoneTIMESTAMP WITH TIME ZONE=>timestamptimezoneTIMESTAMP(0-6) WITH TIME ZONE=>timestamptimezone
- PostgreSQL
Datasources
ModelAwareTrait::$modelClassは protected になりました。
Error
- エラーハンドラークラス
BaseErrorHandler、ErrorHandlerおよびConsoleErrorHandlerの内部が変更されました。 これらのクラスを拡張した場合は、それに応じて更新する必要があります。 ErrorHandlerMiddlewareは、例外レンダラークラス名またはインスタンスではなく、 コンストラクター引数として、エラーハンドラークラス名またはインスタンスを受け取るようになりました。
Event
- 件名のないイベントで
getSubject()を呼び出すと、例外が発生するようになりました。
Http
Cake\Http\ServerRequest::referer()は、デフォルトでlocalパラメーターを false ではなく true に設定します。 これにより、リファラーヘッダーはデフォルトでアプリケーションのドメインに制限されるため、リファラーヘッダーの使用がより安全になります。- パラメーターが欠落している場合の
Cake\Http\ServerRequest::getParam()のデフォルト値は、falseではなくnullになりました。 Cake\Http\Client\Request::body()は削除されました。代わりに、getBody()かwithBody()を使用してください。Cake\Http\Client\Response::isOk()は、すべての 2xx および 3xx レスポンスコードに対して、trueを返すようになりました。Cake\Http\Cookie\Cookie::getExpiresTimestamp()は、数値を返すようになりました。 これにより、setcookie()で使用されているものと型が一致します。Cake\Http\ServerRequest::referer()は、現在のリクエストにリファラーがない場合、nullを返すようになりました。 以前は、/を返していました。Cake\Cookie\CookieCollection::get()は、存在しないクッキーにアクセスすると、例外を返すようになりました。 クッキーの存在をチェックするためにhas()を使用してください。Cake\Http\ResponseEmitter::emit()のシグネチャが変更され、 2 番目の引数がなくなりました。App.mergeFilesAsObjectsのデフォルト値はtrueになりました。アプリケーションがファイルアップロードを使用する場合、 このフラグをfalseに設定することで、 3.x の動作との互換性を維持できます。Cake\Http\Response::getCookie()によって返される配列キーが変更されました。expireがexpiresに、httpOnlyがhttponlyに変わりました。
HttpSession
- セッションクッキー名は、デフォルトで
CAKEPHPに設定されなくなりました。代わりに、php.iniファイルで定義された、 デフォルトのクッキー名が使用されます。Session.cookie設定オプションを使用してクッキー名を設定できます。 - セッションクッキーは、デフォルトで
SameSite属性がLaxに設定されるようになります。 詳細については、 Session Configuration セクションを確認してください。
I18n
Cake\I18n\DateやCake\I18n\FrozenDateオブジェクトを JSON エンコードすると、 以前の形式yyyy-MM-dd'T'HH:mm:ssxxxではなく、yyyy-MM-dd形式で 日付部分のみの文字列が生成されるようになりました。
Mailer
Email::set()は削除されました。代わりにEmail::setViewVars()を使用してください。Email::createView()は削除されました。Email::viewOptions()は削除されました。代わりに$email->getRenderer()->viewBuilder()->setOption()を使用してください。
ORM
Table::newEntity()は、入力として配列を必要とし、検証が実行されずに偶発的な保存がされることを防ぐために、 検証を実施します。つまり、入力無しでエンティティーを作成するには、Table::newEmptyEntity()を使用する必要があります。Query::where()に['name' => null]のような条件を使用すると、例外が発生します。 3.x では、 SQL のname = NULLのような条件のSQLを生成していましたが、これは常に 0 行と一致するため、誤った結果を返します。nullと比較するときは、['name IS' => null]のようなIS演算子を使用する必要があります。- false ではなく、エンティティーではない結果で、
Model.beforeSaveイベントを停止すると、例外が発生します。 この変更により、Table::save()は常にエンティティーまたは false を返します。 - テーブルクラスは、テーブル名とカラム名のエイリアスがデータベースによって切り捨てられた場合に、例外を投げるようになりました。 これは実際のエイリアスが一致しない場合、隠れたエラーが発生する前に警告を発するものです。
TableLocator::get()およびTableRegistry::get()は常に CamelCase 形式のエイリアスを期待するようになりました。 予期せぬ形式のエイリアスが渡された場合、テーブルやエンティティクラスが正しくロードされません。IsUniqueルールはデフォルトで有効になっていたallowMultipleNullsオプションを受け付けなくなりました。 このオプションは 4.2 で再度追加されましたが、デフォルトでは無効になっています。
Router
Router::prefix()および$routes->prefix()で生成されたルーティングプレフィックスは、 アンダースコアーではなく、キャメルケースになりました。my_adminの代わりに、MyAdminを使用する必要があります。 この変更により、プレフィックスが他のルーティングパラメーターで正規化され、語尾変化のオーバーヘッドが削除されます。RouteBuilder::resources()は、 URL 内のリソース名をデフォルトではアンダースコア形式の代わりにダッシュ形式で変換するようになりました。$options引数で、'inflect' => 'underscore'を使用することで、アンダースコア形式での変換を保持できます。Router::plugin()およびRouter::prefix()は、デフォルトで URL のダッシュ形式のプラグイン/プレフィックス名を 使用するようになりました。$options引数で、'path'キーを使用して、下線(または他のカスタムパス)を保持できます。Routerは、リクエストのスタックではなく、リクエストの単一インスタンスのみへの参照を維持します。Router::pushRequest()、Router::setRequestInfo()およびRouter::setRequestContext()は削除されました。 代わりに、Router::setRequest()を使用してください。Router::popRequest()は削除されました。Router::getRequest()には、$current引数がなくなりました。
TestSuite
Cake\TestSuite\TestCase::$fixturesは、コンマ区切りの文字列にすることができなくなりました。配列でなければなりません。
Utility
Cake\Utility\Xml::fromArray()は$optionsパラメーターの配列を必要とします。Cake\Filesystem\Folder::copy($to, array $options = [])およびCake\Filesystem\Folder::move($to, array $options = [])には、 最初の引数として抽出されたターゲットパスがあります。Xml::build()のreadFileオプションは、デフォルトで true ではなくなりました。 代わりに、ローカルファイルを読み取るために、readFileを有効にする必要があります。Hash::sort()は、方向パラメーターでSORT_ASCおよびSORT_DESC定数を受け入れるようになりました。Inflector::pluralize()はindexをindicesではなくindexesに反映するようになりました。 これは、この複数形のコアおよびエコシステムでの技術的な使用を反映しています。
View
- テンプレートは、 app や plugin ルート上の
src/Template/からtemplates/フォルダーへ移動されました。 この変更により、srcフォルダーには、 composer のオートローダーを介して オートロードされるクラスを持つファイルのみが含まれるようになりました。 Cell、Element、EmailおよびPluginといった特別なテンプレートフォルダーは、 それぞれ小文字のcell、element、emailおよびpluginに名前が変更されました。 これにより、特別なフォルダーとアプリケーションのコントローラー名に対応するCamelCase形式のフォルダーを 視覚的に区別しやすくなります。- テンプレートの拡張子も、
.ctpから.phpに変更されました。 特別な拡張子は、実際の利点を提供せず、代わりに、.ctp拡張子を持つファイルを PHP ファイルとして認識するように エディターや IDE を設定する必要がありました。 ViewBuilder::setLayout()またはView::setLayout()の引数としてfalseを使用して、View::$layoutプロパティをfalseに設定することはできなくなりました。 代わりに、ViewBuilder::disableAutoLayout()やView::disableAutoLayout()を使用して、 レイアウトなしでビューテンプレートを描画します。Cake\View\Viewは、render()が複数回呼び出された場合、nullを返す代わりに再描画します。- 定数
View::NAME_ELEMENTとView::NAME_LAYOUTは削除されました。View::TYPE_ELEMENTとView::TYPE_LAYOUTが使用できます。
Helper
Cake\View\Helper\PaginatorHelper::hasPage()の引数が逆になっています。 これにより、 'model' が第 2 引数である他のページネーターメソッドとの一貫性が保たれます。Cake\View\Helper\UrlHelper::build()は第 2 引数にブール値を受け入れなくなりました。 代わりに、['fullBase' => true]を使用しなければなりません。- コンテキスト無しでフォームを作成するには、
FormHelper::create()の最初の引数として、nullのみを使用する必要があります。コンテキストを推測できない他の値を渡すと、例外がスローされます。 Cake\View\Helper\FormHelperおよびCake\View\Helper\HtmlHelperは、 HTML データ属性data-confirm-messageを使用して、confirmオプションを持つメソッドの確認メッセージを保持するようになりました。Cake\View\Helper\FormHelper::button()は、 HTML エンティティーがデフォルトで、ボタンテキストと HTML 属性 をエンコードするようになりました。新しいオプションescapeTitleが追加され、 他の HTML 属性とは別にタイトルのエスケープを制御できるようになりました。Cake\View\Helper\SecureFieldTokenTraitが削除されました。 そのフォームトークンデータ構築機能は、内部クラスFormProtectorに含まれるようになりました。HtmlHelper::docType()メソッドが削除されました。HTML4 および XHTML は廃止され、 HTML5 の doctype は非常に短く、直接入力するのが簡単です。HtmlHelper::scriptBlock()およびHtmlHelper::scriptStart()のsafeオプションが削除されました。 有効にすると、現在無効になっている XHTML のみに必要なCDATAタグを生成します。
Log
Cake\Log\LogTrait::log()およびCake\Log\Log::write()などのログ関連メソッドは、$message引数に文字列のみを受け入れるようになりました。 この変更は、 API を PSR-3 標準に合わせるために必要でした。
その他
- アプリケーションの
config/bootstrap.phpには、Router::fullBaseUrl()への呼び出しを含めてください。 最新のスケルトンアプリケーションのbootstrap.phpを参照し、それに応じて更新します。 App::path()は、Templateの代わりに$typeおよびtemplatesを使用して、 テンプレートへのパスを取得します。同様にロケールフォルダーのパスを取得するには、Localeの代わりにlocalesを使用します。ObjectRegistry::get()は、指定された名前のオブジェクトがロードされていない場合、例外をスローするようになりました。ObjectRegistry::has()を使用して、オブジェクトがレジストリーに存在することを確認する必要があります。 マジックゲッターObjectRegistry::__get()は、指定された名前のオブジェクトがロードされない場合、 引き続きnullを返します。- ロケールファイルは、
src/Localeからresources/localesに移動しました。 - CakePHP にバンドルされていた
cacert.pemファイルは、 composer/ca-bundle への依存関係に置き換えられました。
新機能
Console
- コマンドクラスは、
defaultName()メソッドを実装して、慣習に基づいた CLI 名を上書きできます。
Core
InstanceConfigTrait::getConfigOrFail()およびStaticConfigTrait::getConfigOrFail()が追加されました。 他のorFailメソッドと同様に、これらのメソッドは要求されたキーが存在しないかnull値を持っている場合に例外を発生させます。
Database
- データベースのタイムゾーンが PHP のタイムゾーンと一致しない場合は、
DateTime::setDatabaseTimezone()を使用できます。 詳しくは、 datetime-type をご覧ください。 DateTime::setKeepDatabaseTimezone()により、クエリーによって生成された DateTime オブジェクトに、 データベースのタイムゾーンを保持できます。Cake\Database\Log\LoggedQueryはJsonSerializableを実装するようになりました。Cake\Database\Connectionで PSR-3 のロガーを使用できるようになりました。 その結果、スタンドアロンのデータベースパッケージを使用しているユーザーは、 ロギングにcakephp/logパッケージを使用することを強制されなくなりました。Cake\Database\Connectionで PSR-16 のキャッシャー を使用できるようになりました。 その結果、スタンドアロンのデータベースパッケージを使用しているユーザーは、 キャッシングにcakephp/cacheパッケージを使用することを強制されなくなりました。 新しいメソッドCake\Database\Connection::setCache()およびCake\Database\Connection::getCache()が追加されました。Cake\Databases\ConstraintsInterfaceがCake\Datasource\FixtureInterfaceから抽出されました。 このインターフェースは、制約をサポートするフィクスチャー実装によって実装する必要があります。 これは、私たちの経験からは一般にリレーショナルデータベースです。- 抽象型
charが追加されました。このタイプは、固定長の文字列カラムを処理します。 - 抽象型
datetimefractionalおよびtimestampfractionalが追加されました。 このタイプは、秒の小数部を持つカラムデータ型を処理します。 - SqlServer スキーマは、 SYSDATETIME() などの関数を含むデフォルト値をサポートするようになりました。
- 抽象型
datetimetimezoneおよびtimestamptimezoneが追加されました。 このタイプは、タイムゾーンをサポートするカラムデータ型を処理します。
Error
- 接頭辞付きのコントローラーアクションによってエラーが発生した場合、
ErrorControllerは接頭辞付きのエラーテンプレートがある場合は、それを利用します。 この動作はdebugがオフの場合にのみ適用されます。
Http
- フレームワーク全体を含めずに
cakephp/httpを使用できます。 - CakePHP は PSR-15: HTTP Server Request Handlers の仕様をサポートするようになりました。 結果としてミドルウェアは
Psr\Http\Server\MiddlewareInterfaceを実装するようになりました。 CakePHP 3.x スタイルの呼び出し可能なダブルパスミドルウェアは、後方互換性のために引き続きサポートされています。 Cake\Http\Clientは PSR-18: HTTP Client の仕様に準拠するようになりました。Cake\Http\Client\Response::isSuccess()が追加されました。このメソッドは、 レスポンスステータスコードが 2xx の場合 true を返します。CspMiddlewareが追加され、コンテンツセキュリティポリシーヘッダーの定義がより簡単になりました。HttpsEnforcerMiddlewareが追加されました。これによりSecureComponentのrequireSecure機能が 置き換えられました。- Cookie は
SameSite属性をサポートするようになりました。
I18n
DateおよびFrozenDateは、today('Asia/Tokyo')のようなさまざまなファクトリーヘルパーの タイムゾーンパラメーターを尊重するようになりました。
Mailer
- メールメッセージ生成の責務は
Cake\Mailer\Rendererに移されました。 これは主にアーキテクチャーの変更であり、Emailクラスの使用方法には影響しません。 唯一の違いは、テンプレート変数を設定するためにEmail::set()の代わりにEmail::setViewVars()を使用する必要があることです。
ORM
Table::saveManyOrFail()メソッドが追加され、エラーの場合に失敗した特定のエンティティーでPersistenceFailedExceptionをスローします。- コールバックを含む多くのエンティティーを一度に削除するための
Table::deleteMany()およびTable::deleteManyOrFail()メソッドが追加されました。 エンティティーはトランザクションセーフで削除されます。 - 新しい空のエンティティーオブジェクトを作成するために
Table::newEmptyEntity()が追加されました。 これはフィールドバリデーションをトリガーしません。 エンティティは、空のレコードとして検証エラーなしで永続化できます。 Cake\ORM\RulesChecker::isLinkedTo()およびisNotLinkedTo()が追加されました。 これらの新しいアプリケーションルールを使用すると、関連付けがあるかもしくは関連レコードがあるかどうかを確認できます。- 新しい型クラス
DateTimeFractionalTypeがマイクロ秒精度の日付型として追加されました。 この型をデフォルトのdatetime型としてTypeFactoryに追加するか、個々のカラムに再マッピングすることで、 この型の使用を選択できます。このタイプをデータベースタイプに自動的にマッピングする方法については、 Database migration notes を参照してください。 - タイムゾーンをサポートする日時型に、新しい型クラス
DateTimeTimezoneTypeが追加されました。 この型をデフォルトのdatetime型としてTypeFactoryに追加するか、個々のカラムに再マッピングすることで、 この型の使用を選択できます。このタイプをデータベースタイプに自動的にマッピングする方法については、 Database migration notes を参照してください。
Routing
Cake\Routing\Assetが追加されました。このクラスは、Router::url()と同等の静的インターフェースで、 アセットURL生成を公開します。詳しくは asset-routing をご覧ください。
TestSuite
TestSite\EmailTrait::assertMailContainsAttachment()が追加されました。
Validation
Validation::dateTime()がマイクロ秒を含む値を受け入れるようになりました。
View
FormHelperは、エンティティーの ORM テーブルクラスで "notEmpty" とマークされたフィールドの HTML5 検証メッセージを生成するようになりました。この機能はautoSetCustomValidityクラス設定オプションで切り替えることができます。FormHelperは、日時フィールドのネイティブ HTML5 入力タグを生成するようになりました。 詳しくは、`Form Helper <create-datetime-controls>` ページを参照してください。 以前のマークアップを保持する必要がある場合は、シム化された FormHelper が Shim plugin にあり、 古い動作・生成が含まれています(4.x ブランチ)。FormHelperは、時間コンポーネントを持つdatetimeウィジェットのデフォルトのステップサイズを 秒に設定するようになりました。フィールドが新しいdatetimefractionalもしくはtimestampfractionalデータベースタイプからのものである場合、デフォルトはミリ秒です。