🥐

新ブログ作成

2024/01/03に公開

チュートリアルは管理する部分を学習して終わりだった
本当にブログを作りたいなら自分でどうにかするしかない用だ
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