baserCMS5では、CakePHP4系にアップデートしたことに伴い、baserCMS4からの変更点が多数ありますのでご注意ください。
// baserCMS4
Router::parse($url);
// baserCMS5
Router::getRouteCollection()->parse($url);
テーブルロケータの利用に変更となっています。
// baserCMS4
ClassRegistry::init('User');
// baserCMS5
TableRegistry::getTableLocator()->get('BaserCore.Users');
// コントローラーの場合
$this->getTableLocator()->get('BaserCore.Users');
validate
プロパティでの定義から、validationDefault
メソッドでの定義へと変更となっています。
カスタムファインダー treeList
を利用します。
$list = $categories->find('treeList', ['spacer' => ...]);
次のプロパティは廃止となりました。
// baserCMS4
if ($this->request->data) {}
// baserCMS5
if ($this->request->is('post')) {}
$request = $this->getRequest(); // Controller / View
$request = Router::getRequest(); // Other
// baserCMS4
$data = $request->data;
// baserCMS5
$data = $request->getData();
// リクエストの書き換え
// CakePHP4系の getRequest() は clone されることが前提のため注意が必要
$this->setRequest($this->getRequest->withParsedBody($data));
// baserCMS4
$action = $request->params['action'];
// baserCMS5
$action = $request->getParam('action');
// パラメータなし
$url = $request->getPath();
// パラメータあり
$url = $request->getRequestTarget();
セッションはリクエストから取得する仕様に変更となりました。
$session = $request->getSession();
$data = $session->read('etc');
baserCMS4 では、$this->request->data
にセットしていましたが、エンティティによるセットに変更となりました。
サービスクラスに getNew()
メソッドを作成しそこで初期値を生成し、Adminサービスクラスにより一括設定を行います。
// サービス
class SitesService
{
public function getNew(): EntityInterface
{
return $this->Sites->newEntity([
'status' => false,
], [
'validate' => false,
]);
}
}
// Adminサービス
class SitesAdminService
{
public function getViewVarsForAdd()
{
return [
'site' => $this->getNew()
];
}
}
// コントローラー
class SitesController extends BcAdminAppController
{
public function add(SiteAdminServiceInterface $service)
{
$this->set($service->getViewVarsForAdd());
}
}
// ビュー
$this->BcAdminForm->create($site);
// baserCMS4
$this->search = $templateName;
// baserCMS5
$this->setSearch($templateName); // コントローラー
$this->BcAdmin->setSearch($templateName); // テンプレート
テンプレートのヘッダーでの定義を推奨しています。
// baserCMS4
$this->help = $templateName;
// baserCMS5
$this->setHelp($templateName); // コントローラー
$this->BcAdmin->setHelp($templateName); // テンプレート
テンプレートのヘッダーでの定義を推奨しています。
// baserCMS4
$this->pageTitle = $title;
// baserCMS5
$this->setTitle($title); // コントローラー
$this->BcAdmin->setTitle($templateName); // テンプレート
テンプレートのヘッダーでの定義を推奨しています。
CSRF対策用の処理は、セキュリティコンポーネントから、ミドルウェアに移行となり、SSL要求、バリデートポストをセキュリティコンポーネントにて実装します。
管理画面から呼び出す Ajax のアクションについて、返却値を JSON化できるものは、Api 用のコントローラーに移行し、そちらを呼び出すようになりました。
ただし、HTMLを返却するもので、JSON化の難易度が高いものは、Admin 用のコントローラーでそのまま移行しています。
ビューのテンプレートは、管理画面用のものは、BcAdminThirdプラグイン内に、フロントページのものは、BcFrontプラグイン内に全て取りまとめています。
// baserCMS4
$this->BcForm->input()
// baserCMS5
$this->BcAdminForm->control()
エンティティは配列からオブジェクトに変更となっています。
// baserCMS4
$user['User']['real_name_1'];
// baserCMS5
$user->real_name_1;
既存の配列は次の正規表現でオブジェクトのコードに置換できます。
# 検索対象
\$modelName\['ModelName'\]\['(.+?)'\]
# 置き換え後
\$modelName->$1
baserCMS4では、検索処理について POST でデータを渡していましたが、検索状態をURLで共有できるようにするため、GET で渡すように処理を変更します。
// baserCMS4
$this->BcTime->format($format, $date);
// baserCMS5
$this->BcTime->format($date, $format);
また、フォーマットの形式が変更となっているので注意が必要です。YYYY-MM-dd
名前付きパラメータは仕様から削除されています。クエリーストリングに変換します。
// 名前付きパラメーター
$this->BcBaser->link('hoge', ['controller' => 'Users', 'action' => 'index', 'name1' => 1, 'named2' => 2]);
// クエリーストリング
$this->BcBaser->link('hoge', ['controller' => 'Users', 'action' => 'index', '?' => ['name1' => 1, 'named2' => 2]]);
テーマの定義は、次のメソッドにて行っています。
// 管理画面
BaserCore\Controller\Admin\BcAdminAppController::beforeRender()
// フロントページ
BaserCore\Controller\BcFrontAppController::beforeRender()
baserCMS4にて一覧で利用していたAjax呼び出しは廃止になりました。
フォームコントロールにおいてクラス名は不要となりました。フィールド名だけ定義します。
$this->BcAdminForm->control('field_name');
AppHelper
はなくなりました。
継承先が Helper
になっています。
イベントを実装するには、BcEventDispatcherTrait
を利用します。
class ClassName extends Cake\View\Helper {
use BcEventDispatcherTrait;
}
フォームコントロールのIDは、baserCMS4系でドットを境にアッパーキャメルケースになっていましたが、ハイフン区切りになっています。
// コード例
echo $this->BcAdminForm->control('ViewSetting.mode', ['type' => 'hidden', 'value' => 'index']);
// 出力HTML
<input type="hidden" name="ViewSetting[mode]" class="bca-hidden__input" id="viewsetting-mode" value="index">
Cake\Core\Plugin::path($pluginName)
これまでの FixtureManager によるフィクスチャは非推奨となりました。FixtureFactory を利用します。
CakeScheme はなくなりました。コマンド Console/cake schema
は利用できません。
マイグレーション を利用してください。