🥐
新ブログ作成
チュートリアルは管理する部分を学習して終わりだった
本当にブログを作りたいなら自分でどうにかするしかない用だ
CMS作ってる最中に思ったことを盛り込んで作成していこう
開発環境の作成は前回同様dockerで行い、初期設定が終わったら各テーブルの作成を行う
ER図
ブログの勝手なんて知らないからとりあえずシンプルに
マイグレファイル作成
bin/cake bake migration CreateCategories name:string description:text created modified
bin/cake bake migration CreatePosts title:string body:text category_id:integer created modified
bin/cake bake migration CreateComments post_id:integer name:string body:text created modified
bin/cake bake migration CreateTags name:string created modified
bin/cake bake migration CreatePostsTags post_id:integer tag_id:integer created modified
#config/Migrations
マイグレファイルができたら中身を確認して必要に応じて修正
今回はnull許容関係を忘れていたのと中間テーブルの名前を直す
bin/cake migrations migrate
まとめてマイグレファイルを作ると名前がバッティングしてエラー吐くから注意
モデル作成
bin/cake bake model Categories
#他のテーブルについても同様のコマンド
#src/
テーブルが用意できたらモデルを作成
cakePHP4はデータベースのスキーマを解析して外部キーがあるときは勝手に関連付けをやってくれる
belongsToManyだけはやってくれないので自分で追加する
PostsTable.php
public function initialize(array $config): void
{
parent::initialize($config);
$this->setTable('posts');
$this->setDisplayField('title');
$this->setPrimaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Categories', [
'foreignKey' => 'category_id',
]);
$this->hasMany('Comments', [
'foreignKey' => 'post_id',
]);
$this->hasMany('PostTags', [
'foreignKey' => 'post_id',
]);
// 多対多の関連付けを追記
$this->belongsToMany('Tags', [
'foreignKey' => 'post_id',
'targetForeignKey' => 'tag_id',
'joinTable' => 'post_tags',
]);
}
コントローラ&ビュー
関連付けができたらコントローラとビューを作る
管理画面側であるとわかりやすくするため--prefix adminをつける
これによりadminディレクトリ下にファイルができる
bin/cake bake controller Categories --prefix admin
bin/cake bake template Categories --prefix admin
#他のテーブルも同様
/admin/categoriesのような形でアクセスできるようにルーティングの設定
routes.php
// コメントアウトの下あたりに挿入
/*
* If you need a different set of middleware or none at all,
* open new scope and define routes there.
*
* ```
* $routes->scope('/api', function (RouteBuilder $builder): void {
* // No $builder->applyMiddleware() here.
*
* // Parse specified extensions from URLs
* // $builder->setExtensions(['json', 'xml']);
*
* // Connect API actions here.
* });
* ```
*/
$routes->prefix('admin', function (RouteBuilder $builder) {
$builder->fallbacks(DashedRoute::class);
});
これだけで記事管理部分が出来る
管理側と外部ユーザー側で呼び出すテンプレートを選択するようにする
AppController.php
// src/Controller
public function initialize(): void
{
if ($this->getRequest()->getParam('prefix') === 'Admin') {
$this->viewBuilder()->setLayout('admin_default');
} else {
$this->viewBuilder()->setLayout('default');
}
利便性はともかくデータ管理は一瞬で出来るようになる
bakeコマンド強い
Discussion