【Docker】Nuxt3+Laravel10でfilamentを使って管理画面作成してみた

2024.02.02

CATEGORY : MySQL WEB

こんにちは缶コーラです。

今回は完全に個人用のメモです。

開発環境

技術名バージョンこの記事での用途
Node18.19.0Nuxt用のコンテナに使用されるNode.js
Nuxt3.10.0フロント用のフレームワーク(APIサーバーとは分離想定)
Vue3.4.15Javascriptライブラリ
Laravel10.43.0APIサーバー
Docker24.0.5ローカル開発環境の構築
Nginx1.20.2フロント・サーバーそれぞれのリバースプロキシ

ディレクトリ構成

docker-composeファイルの作成

filament-post-projectディレクトリの中にdocker-compose.ymlを作成します。

appコンテナがLaravel、webコンテナがnginx、dbコンテナがmysql、frontコンテナがnuxtとなります。

上記のようにnginxでポートを2つ指定しているのはフロント、サーバー共にリバースプロキシさせるためです。(80番アクセスでフロント、9000番アクセスでAPI)

PHPコンテナ

Dockerfile

php.ini

zzz-www.conf

nginxコンテナ

Dockerfile

default.conf

リバースプロキシの設定は主にこのファイルで行っています。localhost:80にアクセスするとlocalhost:3000にリバースプロキシされるようになっております。

Nuxtコンテナ

Dockerfile

Laravelのインストール

Laravelのインストールが完了したらlocalhost:9000にアクセスしてwelcomeページが表示されることを確認します。

LaravelからDBコンテナに接続するには、.envファイル(Laravelで使う環境変数を定義しているファイル)の設定を変えます。

すべてのMySQLのテーブルを削除後にマイグレーション&seed

Nuxtのインストール

いよいよ画面構築

今回はPostsというテスト用のテーブルを作り、ブログ記事のように入稿できるシステムを構築していきます。

filamentのインストール

FilamentはTALL技術を基盤とするLaravelの拡張パッケージの1つで、簡単に、ほぼノーコードでSPAライクな管理画面を実装することが可能です。
詳しくFilament Docから

ユーザーを作成する

コマンドを使用して、プロジェクトの新しいユーザーアカウントを作成します。

名前とメールアドレス、パスワードを入力してユーザーを作成したら、ブラウザでlocalhost:9000/adminを開くと、ログイン画面が表示されるはずです。
先ほど作成したアカウントでサインインできます。

マイグレーションファイルの作成

上記コマンドでapp/database/migrationsにマイグレーションファイル「【日付】_create_posts_table.php」が作成されるので以下のように編集します。

maigrateコマンドを実行して、MySQLデータベースにテーブルを作っておきます。
テーブルが出来たか汎用SQLクライアントツール【A5:SQL Mk-2】を使ってDocker上のMySQLに接続して確認しましょう。
下記がA5M2のデータベース接続情報です。(docker-compose.ymlで設定した値)

dokcerが同一端末上で動いていない場合、またはmysqlコンテナ特定のIPからのみ接続可能な設定の場合、SSH2トンネルタブより設定を行い踏み台を経由してください。

モデルの作成

以下のコマンド実行してモデルを作成します。

「リソース」を作る

Postというテーブルを、Filamentで呼べるようにするための必要なファイル=Resource リソースを自動作成する コマンドがあり、実行します。

下記のようにapp/Filament/Reosources以下に

管理画面によくある構成で、対応するファイルが自動で生成されます。

  • 作成画面
  • 編集画面
  • 一覧画面

localhost:9000/adminをブラウザで確認すると、Postsという画面ができています。

【New Post】というボタンを押すとCreate Postページに遷移しますが、ボタンとタイトル以外何も表示されていないのでここに登録内容を設定していきます。

作成画面にパーツを追加

PatientResource.phpを開き、Formメソッドの空の配列schemaに必要な項目を追加します。

追記して、ブラウザをリロードすると追加した項目が表示されます。
必要項目を入力するとレコードが無事できましたが一覧ページにタイトルなど必要な表示がまだありませんので一覧画面に表示項目を追加します。

一覧画面に表示項目を追加

PostResource.phptable()メソッドを以下のように変えて、表示ができるようにします。

一覧ページを更新して確認してみると登録したPostがリスト表示されることが確認できました。

Nuxt(フロント)からLaravel APIをたたいてみる

LaravelでAPIを作成する

backend側(laravel)のcorsの設定をします。以下のようにcors.phpを修正し、環境変数から接続を許可するURLを指定します。(今回であればHOST_URL=http://localhost:3000)

次にAPI用のルーティングを作成

以上でLaravel側での作業は完了です。最後にlocalhost:9000/api/checkへアクセスしてjsonが取得できているかを確認します。

NuxtからAPIに接続

nuxtのapp.vueファイルを下記のように書き換えてください。

Nuxt3にはuseFetchという便利な機能があります。これは主に外部APIとの接続と非同期処理を行うためのものです。
注意点

  • useFetchでURLを指定する際は、localhostではなく、コンテナの名前解決のためにcontainer_nameを指定する必要があります。
  • Laravelはnginxを介してアクセスするため、APIアクセス時もLaravelコンテナではなく、nginxコンテナにアクセスする必要があります。

localhost:80にアクセスしてjsonが取得できていれば、無事完了となります

メモ

・Form BuilderのRichEditorで画像保存や、File uploadを使うときは.envのAPP_URLを正しく設定(この環境ではhttp://localhost:9000)