Dockerを使う前、私のLaravelワークフローはシンプルだが反復的だった。プロジェクトに取り組みたいたびに、ターミナルを開いてphp artisan serveを実行しなければならなかった。それから、もう一つのターミナルでnpm run dev。動きはしたが、面倒だった。
Laravel Sailがそれを変えた。sail up -d一発で、すべてが動き出す。PHP、データベース、Webサーバー、すべてDockerの中だ。毎回セッションごとに手動で開発サーバーを起動する必要はもうなくなった。
好奇心
ある時、Dockerの外で、macOS上でネイティブにPHPを動かすことに興味を持った。正直、最初は混乱した。自分のMacを手に入れたのは去年で、macOSの開発エコシステムにはまったく馴染みがなかった。どこから始めればいいのか、どんなツールがあるのかも分からなかった。最初の直感は、単に「Mac PHP 実行方法」を検索することだった。
検索を始めると、すぐにHomebrewでのPHPインストール、複数バージョンの管理、Nginxの設定、データベースの手動セットアップという迷路にはまり込んだ。慣れ親しんだ単一のsail upコマンドに比べて、動く部品が非常に多いように感じられた。
DBnginとLaravel Herdの発見
そして、すべてを変える2つのツールを見つけた。
DBnginは、PostgreSQL、MySQL、Redisといったデータベースサーバーをローカルで立ち上げられる無料のMacアプリだ。それ自体はデータベースマネージャーではない。そのためには、TablePlus(同じチームによって作られている)と連携する。DBnginがサーバーの実行を担当し、TablePlusがデータの閲覧と管理を担当する。DBnginでStartをクリックするだけで、データベースがlocalhostで動作し始める。
Laravel Herdは、Laravel専用に構築されたネイティブなmacOS開発環境だ。PHP、Nginx、DNSを自動的に処理する。インストールした瞬間、あなたのLaravelプロジェクトはyour-project.testでアクセス可能になる。設定も、手動でのサーバー起動も不要だ。SSLさえも処理してくれる。
目からウロコの瞬間
Herdについて最も感銘を受けたのは、サイトのリンク付けだった。Sailでは、私のプロジェクトはlocalhostに存在していた。Herdでは、即座にhumfurie.testで利用可能になった。hostsファイルの編集も、仮想ホストの設定も不要だ。ただ動く。
開発体験も目に見えて速くなった。PHPがコンテナ内ではなくネイティブに動作するため、Dockerのファイルシステムのオーバーヘッドがない。ページの読み込みは速く、artisanコマンドは即座に実行される。
Laravel Valetはどうなのか?
Herdの無料の代替手段を探しているなら、Laravel Valetがある。実は、これがHerdのベースになっているものだ。同じコンセプト(Nginx、DnsMasq、自動の.testドメイン)だが、GUIがないだけだ。Composer経由でインストールし、すべてをターミナルから管理する。
Herdは本質的に、洗練されたインターフェース、内蔵のPHPバージョン管理、自動SSLのようなおまけを備えたValetだ。コマンドラインからの作業を厭わないなら、Valetは無料で同じコアの体験を与えてくれる。
落とし穴
移行は完全にシームレスではなかった。いくつかつまずいたことがある。
データベース接続:私の.envファイルはDockerの内部ホスト名向けに設定されていた。Dockerの外では、localhostに切り替え、データベースの設定値がDBnginで実際に動いているものとすべて一致していることを確認する必要があった。
Nodeモジュール:私のnode_modulesはDockerコンテナ(Linux ARM)内にインストールされていたため、macOSネイティブのバイナリが欠けていた。node_modulesを新規に再インストールすることで解決した。
PHPバージョンの違い:HerdはPHP 8.5を実行していたが、私のDocker構成はPHP 8.4を使っていた。これにより、新しいバージョンで名前が変更された特定のPDO定数について、非推奨警告が表面化した。
広告ブロッカー:これは予想外だった。私のブラウザの広告ブロッカーが、Vite開発サーバーへのリクエストをブロックしていた。そのドメインをホワイトリストに登録するまで、ページは真っ黒な空白画面として読み込まれていた。
結局どちらが良いのか?
どちらにもそれぞれの居場所がある。
Sailは、チームの一貫性、CI/CDとの整合性、開発環境を本番環境と完全に一致させたい場合に優れている。Linuxを使っている場合は唯一の選択肢でもある。
HerdプラスDBnginは、速さとシンプルさを求める1人でのmacOS開発に優れている。ネイティブなパフォーマンスと自動の.testドメインが、日々のワークフローをよりスムーズにしてくれる。
私は両方を維持している。Sailは、Docker ベースの選択肢としてリポジトリ内に開発用に残しており、デプロイ用には別の本番用Docker Compose構成を持っている。Herdは日々のローカル開発を担当する。SailとHerdの切り替えは、単に.envファイルがどのデータベースホストを指しているかの問題にすぎない。