LoginSignup
1

CakePHP5への移行

Last updated at Posted at 2023-12-24

先日、2023年4月19日に、CakePHP4系に対応した baserCMS5というバージョンをリリースしたのですが、その後、9月にCakePHP5系がリリースされてしまいましたので、、、
現在、鋭意移行作業を進めています。

CakePHP3系4系への移行の時ほど大変ではないのですが、なかなか引っかかりポイントがありましたので軽くまとめてみます。

全般

File / Folderクラスがなくなった

baserCMS4系ではかなり多くの場所で使っていたので、これはかなり大変でした。

PHP標準の SplFileInfo などを使えとのことでしたが、結構使いにくいので、ラッパークラスを使って移行をしやすくしました。

BcFile / BcFolder

FrozenTimeがDateTimeへ

これはアップグレードツールである程度やってくれます。

// Cake4系
\Cake\I18n\FrozenTime
// Cake5系
\Cake\I18n\DateTime

プラグインのロードが設定ファイルでできるようになった

プラグインのロードは、 config/plugins.php でできるようになったようです。

デバッグ時のみロード、CLIの場合のみロードなどと指定もできます。

callable の設定が Closure に

こちらは全てではないかもしれませんが、コールバック処理として指定する callable な 関数が、Closureでないと怒られる場合があるようです。

// 例)ServerRequestにおける管理画面判定
// 4系
$this->getRequest()->addDetector('admin', [$this, 'isAdmin']);
// 5系
$this->getRequest()->addDetector('admin', $this->isAdmin(...));

最近、ドット3つの省略記法が増えましたね。

スッキリしていい感じですが、理解してないと読めないなこれ。

リクエスト

SSLの判定方法が変わった

// Cake4系
$this->getRequest()->is('ssl')
// Cake5系
$this->getRequest()->is('https')

アップロードファイルのデータオブジェクトに

CakePHP4までは、配列とオブジェクトを選択できるようになっていたのですが、その設定がなくなり、UploadedFileのインスタンスで取得するようになっています。

コントローラー

ページネーションの結果セットがPaginatedResultSetに

以前は、ページネーションの結果について、 ResultSet で戻ってきていたのですが、PaginatedResultSet で戻るようになりました。

コンポーネント

SecurityComponent がなくなった

HTTPSを強制するには、HttpsEnforcerMiddleware を利用することになり、POSTデータのバリデーションは、 FormProtectionComponent を利用することになりました。

RequestHandlerComponent がなくなった

API開発で利用していたのですが、これもなくなっちゃいました。
JsonView を自動的に利用するためには、コントローラーで viewClasses メソッドを実装し、明示的に指定する必要があります。

public function viewClasses(): array
{
    return [JsonView::class];
}

RSSファイルへのリクエスト判定でも利用していたのですが、こちらは ServerRequest クラスにまとめました。

// RSS判定
$this->RequestHandler->prefers('rss');
// ServerRequest にまとめた
$this->getRequest()->addDetector('rss', ['accept' => ['application/xml'], 'param' => '_ext', 'value' => 'rss'])
$this->getRequest()->is('rss')

テーブル

allowEmptyの指定方法が変わった

型の種類を指定する必要があるようです。

// Table内にて
// Cake4系
$validator->allowEmpty()
// Cake5系
$validator->allowEmptyString()

orderの名称変更

こちらはアップグレードツールである程度やってくれます。

// Cake4系
$query->order();
// Cake5系
$query->orderBy();

Table::get()の第2引き数が名前付き引き数に

これもアップグレードツールである程度やってくれます。

PHPもこんな書き方ができるようになったんですね

// Table内で
// Cake4系
$this->get(1, ['contain' => [$tableName], 'conditions' => $conditions]);
// Cake5系
$this->get(1, contain: [$tableName], conditions: $conditions);

データベース

SQLの発行メソッドが変わった

$db = ConnectionManager::get('default');
// Cake4系
$db->query($sql);
// Cake5系
$db->execute($sql);

ビュー

ヘルパーの追加方法が変わった

// View内にて
// Cake4系
$this->loadHelper($helper);
// Cake5系
$this->addHelper($helper);

テスト

ユニットテストのDataProviderが静的メソッドに

static を付けないと怒られます。

FixtureManagerが利用できなくなった

これはめっちゃ大変。今まで資産がちょっと間違えると負債に転換してしまう。

FixtureFactoryFixtureScenario に移行します。

といった感じでしょうか。


2023年12月24日現在、まだ完了しておらず、これまでに頑張って作った3000のユニットテストがだいぶ死んでしまったので、dev-cake5-adjust ブランチで調整中です。

ユニットテストの調整ができたら、全体的な手動テストを実施して、2024年の3月頃に、baserCMS 5.1.0 としてリリースする予定です。

Laravelもよいですが、CakePHPも良い方向に進歩していますね。baserCMSの開発にご興味ある方は、GitHubのレポジトリを覗いてみてください。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1