カテゴリー
コンピューター

Laravel 11アプリケーション構造アップグレード奮闘記 〜AIと歩むSlim Skeletonへの道〜

はじめに(この記事について)

この記事は、Gemini CLI を使って作業した最後に、一緒に行った作業をブログとして出力したものを大部分そのまま採用し、少し軌道等を修正したものです。

はじめに:なぜ今、Laravel 11のSlim Skeletonへ移行するのか?

このプロジェクトは、RESTful APIのバックエンドとシングルページアプリケーション(SPA)のフロントエンドを持つWebアプリケーションのボイラープレート(ひな形)です。Laravel9をベースに構築されていましたが、バージョン 11 までアップグレードし、この時に、Laravel 11が導入した「Slim Skeleton(合理化されたアプリケーション構造)」への移行を決断しました。

Laravel11では、従来のバージョンと比較して多くの設定ファイルやボイラープレートコードが削除され、よりミニマルで効率的な開発環境が提供されます。ドキュメントには「既存プロジェクトの移行は非推奨」という文面があります。ボイラープレートでなければ、このままの構造としたでしょう。一方で、ボイラープレートとしての使命は、常に最新のベストプラクティスと構造を提供することにあります。この抜本的な構造変更に対応することで、将来のメンテナンス性向上と、よりクリーンなコードベースを目指しました。

本稿では、AIエージェント(以下、AI)との対話を通じて、この挑戦的なアップグレード作業がどのように進められ、どのような困難に直面し、それをどう乗り越えたのかを詳細に記録します。特に、トライアル&エラーのプロセスを厚く記述し、同様の移行を行う際の参考となることを狙っています。

カテゴリー
コンピューター

Laravel で「Parse, don’t validate」を理解し実践するための思考と設計 – Laravel で FormRequest を境界として扱い、Parse, don’t validate の本質を理解して実践するためのガイド。設計の背景やテスト戦略、app/Data 配置の理由まで。

はじめに(この記事について)

この記事は、OpenAI が開発した生成AIモデル ChatGPT (GPT-5 ?) によって作成された原稿をもとに執筆しています。
私(著者)は、生成AIと対話しながら考えを深め、整理し、Laravel での実装に落とし込んでいく過程をそのままブログ記事としてまとめました。

カテゴリー
Linux

Laravel 9 。 AWS S3 (オブジェクト所有者: ACL 無効、かつ、このバケットのブロックパブリックアクセス設定: パブリックアクセスをすべてブロック) を操作するときに AccessDenied と AccessControlListNotSupported に遭遇した時の解決方法と解決してから一通り操作方法を試した記録

はじめに

AWS S3 を今まで使ったことがありませんでした。テキトーに使い始めてみたら、何やらよくわからないエラーで手間取ってしまいました。そこで、基礎の部分から調べてみようと思い、本投稿を残します。

特に、なぜか S3 フォルダを作成できない問題を解消したかったのでした。

まとめ

カテゴリー
Linux コンピューター

WLS2 の Docker コンテナ内の Laravel9.2 Vite SPA 。 `npm run dev` 時に Docker ホストのウェブブラウザからコンテナ内の Vite 開発サーバに繋がるようにした記録

直面した問題

環境

npm run prod の場合は、静的ファイルを書き出してそのファイルへのリンクを HTML ファイルへ埋め込むようになっています。よって、ビルドされたファイルへのリンクは Laravel へアクセスするときの Apache なり Nginx なり PHP ビルトインサーバなりの URL と同じ URL が埋め込まれ、この URL でアクセスできるため問題はありません。

一方で、 npm run dev の場合は、 Vite の開発サーバが別途立ち上がります。そして Vite でビルドされたファイルへアクセスするための埋め込みリンクは、 Vite の開発サーバの URL となります。 Docker を使う場合、 Docker ホスト側から Docker コンテナ内の Vite 開発サーバへどうやってアクセスするのかが、問題になりました。

例えば、カスタマイズしていない vite.config.jsnpm run dev すると次のようになります。

  1. URL は次のように表示された。
    • VITE ➜ Local: http://localhost:5173/
    • LARAVEL ➜ APP_URL: http://localhost
  2. Docker ホストにて、ウェブブラウザで http://localhost/ にアクセスすると画面真っ白になった。
  3. ページのソースコードを見てみると、 Vite でビルドされたファイルへのリンクは <script type="module" src="http://127.0.0.1:5173/resources/js/app.js"></script> となっていた。この URL にアクセスしてみても ERR_CONNECTION_REFUSED のエラーページとなった。
  4. Docker コンテナの port に "5173:5173" を追加し、再度 http://127.0.0.1:5173 へのアクセスを試したところ、異なるエラー ERR_EMPTY_RESPONSE となったもののやはりエラーページとなった。

今回、これを解決しましたのでメモいたします。

カテゴリー
Linux

nunomaduro/larastan 1.0.3 で Laravel 8 の無編集のソースコードへのエラーに対応したメモ

まとめ

  • composer update nunomaduro/larastan:^1.0 --dev でアップデートしたところ、 Laravel インストールして生成された無編集のソースコードでエラーが発生した、
  • https://github.com/laravel/laravel/blob/8.x/app から最新ソースコードを適用することで解決したエラーもあった。
  • どうしても解決できないものは、 Ignoring Errors | PHPStan を参考にエラー抑制した。
カテゴリー
Linux

Laravel 8 、 Larastan 1.0.3 。API リソースクラスに対してプロパティが無いエラー、例えば Access to an undefined property App\Http\Resources\UserResource::$id. に対応する方法メモ

対応方法まとめ

  • その1
    • API リソースクラスの toArray メソッド冒頭に、例えば /** @var \App\Models\User $this */ と書く。
    • 要は、 PHPDocs で API リソースクラスで使用するモデルを $this に紐づければ良いようだ。
  • その2
    • クラスコメントに、例えば /** @mixin \App\Models\User */ と書く。
    • 要は、 PHPDocs で API リソースクラスに使用するモデルを混ぜ込めば良いようだ。
カテゴリー
Linux

Laravel 8 での Vue.js 3 を使った SPA に Bootstrap Icons を導入するためのメモ

なぜメモったか

Bootstrap Icons · Bootstrap 向けのオープンソース SVG アイコンライブラリ のページを見ると、インストールと使い方は書いてあるものの、それだけでは足りず、調べなければうまく使うことができませんでした。

ですので、調べた内容を、走り書き程度ですが、メモいたします。

カテゴリー
Linux

Laravel 8 の Vue.js 3 の SPA に laravel/ui を使わないで Bootstrap 5 を導入するまでのメモ

まとめ

カテゴリー
コンピューター

Laravel の `DATABASE_URL` を外部の環境変数 (server レベル) で設定している場合、 PHPUnit テストの 1 個目は通常に行われるのに 2 個目で DB 接続エラーとなってしまう問題を解決した

エラー対処まとめ

  • 今回の状況
    • Laravel 8.55.0
    • PHPUnit テストをインメモリ SQLite で行いたい。
    • DATABASE_URL を外部の環境変数 (server レベル) で設定している。
  • テスト用に DATABASE_URL を指定する以外に、 DB_CONNECTIONDB_DATABASE も指定する必要がある。
  • 次のように phpunit.xml に指定すればよい。
        <server name="DATABASE_URL" value="sqlite:///:memory:?foreign_key_constraints=true" force="true"/>
        <server name="DB_CONNECTION" value="sqlite"/>
        <server name="DB_DATABASE" value=":memory:"/>
カテゴリー
コンピューター

Laravel 6 のメールの絡む開発用に MailHog の Docker コンテナを構築する方法のメモ

まとめ

  • Docker 側のコードは mailhog/mailhog イメージを使うだけ。
  • Laravel 側では、 .env を変更するだけ。