既存のLaravel 10プロジェクトにStatamic CMSを導入する
calendar_today
2023-06-13
insights
views: 423
thumbnail images

Statamicとは

Laravelで使用できるCMS。CMSで有名なものはWordPressだが、StatamicはLaravel10やPHP8.xに対応しているモダンなCMS。
打倒WordPressとして開発されているらしい。
新規でプロジェクトを作成する場合はもちろん、既存のプロジェクトにもインストールできる。プラグインなども色々と用意されているようで、Livewireのプラグインもあった。
開発も活発に行われているのでセキュリティ的な観点からも問題無さそう。最近(2023/05/09)Statamic 4がリリースされた。
UIが現在日本語が用意されていないので、そこだけ注意。

唯一懸念するものがあるとすれば、日本語の情報がゼロなんじゃないかというレベルで全くヒットしないこと。公式のドキュメントはそこそこ分かりにくいので、機械翻訳しながらじっくり読もう。

料金

Statamicは無料で導入できるが、Proバージョンもある。
以下機械翻訳 + α.

Solo Pro Enterprise
料金 無料 1年目259ドル、2年目以降59ドル お問い合わせ
40以上のフィールドタイプを使用しコンテンツを整理及び公開 無制限のユーザーアカウントとロール 優先サポート SLA
無制限のコレクションと分類法 改訂、下書き、コンテンツ履歴 カスタム調達またはベンダー契約
すべてのフロントエンド機能 マルチサイト、多言語、マルチユーザー編集 オンボーディング、トレーニング、コンサルティングの利用
1つの管理者ユーザーアカウントとコンテンツ フォーム コントロール パネルで Git を統合 特殊なライセンス
基本的な開発者サポート

ソロでも基本機能は使えるが、収益化ブログなどで改訂や下書き、コンテンツ履歴などを使用したい場合はProを契約しないといけなさそう。
でも試した感じだとソロでも下書き機能使える?要調査。

導入する

今回は既存のプロジェクトにインストールする場合の手順を記載する。

今回の環境・構成

  • PHP 8.2
  • Laravel 10.x
  • Livewire 2.x
  • WSL2
  • Laradock
  • Statamic 4

手順

1. composerで使用するコマンドを手動で追加

// composer.json
"scripts": {
    "post-autoload-dump": [
        "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
        "@php artisan package:discover --ansi",
        "@php artisan statamic:install --ansi", // 追加
        "@php artisan statamic:search:update --all --ansi",
        "@php artisan statamic:static:clear --ansi"
    ],
}

2. statamicインストール

以下のコマンドでcontent/, resources/users/, config/statamic/が新たに作成される。

composer require statamic/cms --with-dependencies
composer require jonassiewertsen/statamic-livewire

3. config/auth.phppasswordを追加

// config/auth.php
'activations' => [
    'provider' => 'users',
    'table' => 'password_activations',
    'expire' => 4320,
    'throttle' => 60,
],

4. config/statamic/users.phppasswordを以下のように変更

// config/statamic/users.php
'passwords' => [
    'resets' => 'users',
    'activations' => 'activations',
],

5. migrationファイルの生成

以下のコマンドでdatabase/migrationにstatamicに必要なテーブル情報の入ったmigrationファイルが作成される。

php please auth:migration

6. migrationファイルの編集

既存のプロジェクトに合わせてmigrationファイルを変更するので、絡む情報などを適宜変更する。当方の環境では以下の用に変更した。

// database/migration/2023_06_01_101000_statamic_auth_tables.php
~~~~~省略~~~~~
   public function up()
    {
        Schema::table('users', function (Blueprint $table) {
-           $table->boolean('super')->default(false);
+           $table->boolean('super')->default(false)->after('profile_photo_path');
-           $table->string('avatar')->nullable();
+           $table->string('avatar')->nullable()->after('profile_photo_path');
-           $table->json('preferences')->nullable();
+           $table->json('preferences')->nullable()->after('profile_photo_path');
-           $table->timestamp('last_login')->nullable();
+           $table->timestamp('last_login')->nullable()->change();
            $table->string('password')->nullable()->change();
        });

        ~~~~~省略~~~~~
    }
~~~~~省略~~~~~

7. migration実行

php artisan migrate

8. データベースのusersテーブル編集

既存のusersテーブルをstatamicに対応させるためにこの工程が必要。
自分の(もしくは管理画面に入るユーザの)superフラグを立てる。

UPDATE FROM users SET super = 1 WHERE id = 1;

9. /cpにアクセス

/cp にアクセスするとログイン画面が表示され、ログインすることでstatamicのダッシュボードにアクセスできる。

これでstatamicが使えるようになった。

既存システムから記事の移植

Statamicでは各記事を.mdファイルとして格納するが、既存のサイトの記事がテーブルデータである場合、Statamicの形式に変換する必要がある。
移行する方法はいくつかあると思うが、自分では以下の方法でmdファイル化した。

1. collectionsの作成

Statamicでcollectionsを作成する。データベースで言うテーブルのような、投稿の持つモデルのようなもの。
/cp/collectionsで作成できる。
今回は既存システムのモデルと同じpostsという名前で作成した。

2. seederファイル作成

移行時にコマンドでmdファイルが作成できるようにする。

php artisan make:seeder StatamicSeeder

3. seederファイル編集

モデルPostを一つずつファイルに書き込む。
markdownファイルの構成は他にstatamicで管理したい情報があれば適宜追加してほしい。

public function run(): void
{
    Post::all()->each(function ($post) {
        $md = <<<EOF
        ---
        published: true
        blueprint: post
        title: $post->title
        updated_by: $post->updated_by
        updated_at: {$post->updated_at->timestamp}
        ---
        $post->content
        EOF;

        $res = Storage::build([
            'driver' => 'local',
            'root' => base_path(),
        ])
            ->put("content/collections/posts/{$post->created_at->format('Y-m-d')}.$post->title.md", $md);

        echo $post->id . ($res ? ' success' : ' failed') . "\n";
    });
    // 便宜上、権限付与のコマンドを出力しておく
    echo 'please run "chmod 775 -R ' . base_path('content/collections/posts') . "\"\n";
}

4. seeder実行、権限付与

php artisan db:seed --class=StatamicSeeder
chmod 775 -R /var/www/html/content/collections/posts

これで、/cp/collectionsにアクセスしpostsに遷移すると、既存と同じ記事のデータが入ると思う。

statamicの使用方法

// 記述中...

calendar_today
2023-06-13
insights
views: 423