はじめに

macOS または Windows で Laravel アプリケーションをさらに簡単に開発する方法を探していますか? Laravel Herd をチェックしてください。Herd には、Laravel 開発を開始するために必要なすべてが含まれており、Valet、PHP、および Composer が含まれています。

Laravel Valet は、macOS のミニマリスト向けの開発環境です。Laravel Valet は、マシンが起動するときに常に Nginx をバックグラウンドで実行するように Mac を設定します。その後、DnsMasq を使用して、Valet は *.test ドメイン上のすべてのリクエストをローカルマシンにインストールされたサイトにポイントします。

言い換えれば、Valet は約 7 MB の RAM を使用する超高速の Laravel 開発環境です。Valet は SailHomestead の完全な代替品ではありませんが、柔軟な基本を望む場合や、極端な速度を好む場合、または限られた RAM を搭載したマシンで作業している場合には素晴らしい代替手段を提供します。

初期設定では、Valet のサポートには以下が含まれますが、これに限定されません:

ただし、独自の カスタムドライバー で Valet を拡張することもできます。

インストール

Valet は macOS と Homebrew を必要とします。インストールの前に、Apache や Nginx などの他のプログラムがローカルマシンのポート 80 にバインドされていないことを確認してください。

始めるには、まず update コマンドを使用して Homebrew が最新であることを確認する必要があります:

  1. brew update

次に、Homebrew を使用して PHP をインストールします:

  1. brew install php

PHP をインストールした後、Composer パッケージマネージャー をインストールする準備が整いました。さらに、$HOME/.composer/vendor/bin ディレクトリがシステムの「PATH」に含まれていることを確認してください。Composer がインストールされた後、Laravel Valet をグローバル Composer パッケージとしてインストールできます:

  1. composer global require laravel/valet

最後に、Valet の install コマンドを実行できます。これにより、Valet と DnsMasq が構成され、インストールされます。さらに、Valet が依存するデーモンがシステム起動時に起動するように構成されます:

  1. valet install

Valet がインストールされたら、ターミナルで *.test ドメインに ping を送信してみてください。ping foobar.test のようなコマンドを使用します。Valet が正しくインストールされていれば、このドメインが 127.0.0.1 で応答するのが見えるはずです。

Valet は、マシンが起動するたびに必要なサービスを自動的に開始します。

PHP バージョン

グローバル PHP バージョンを変更する代わりに、isolate コマンド を介して Valet にサイトごとの PHP バージョンを使用するよう指示できます。

Valet は valet use php@version コマンドを使用して PHP バージョンを切り替えることができます。指定された PHP バージョンがまだインストールされていない場合、Valet は Homebrew を介してそのバージョンをインストールします:

  1. valet use
  2. valet use php

プロジェクトのルートに .valetrc ファイルを作成することもできます。.valetrc ファイルには、サイトが使用する PHP バージョンを含める必要があります:

  1. php=php@8.2

このファイルが作成されたら、valet use コマンドを実行するだけで、コマンドはファイルを読み取ってサイトの優先 PHP バージョンを決定します。

Valet は、複数の PHP バージョンがインストールされていても、一度に 1 つの PHP バージョンのみを提供します。

データベース

アプリケーションにデータベースが必要な場合は、MySQL、PostgreSQL、および Redis を含む無料のオールインワンデータベース管理ツールである DBngin をチェックしてください。DBngin をインストールした後、127.0.0.1root ユーザー名と空の文字列をパスワードとして使用してデータベースに接続できます。

インストールのリセット

Valet のインストールが正しく動作しない場合は、composer global require laravel/valet コマンドを実行し、その後 valet install を実行すると、インストールがリセットされ、さまざまな問題を解決できます。稀に、valet uninstall --force を実行し、その後 valet install を実行して Valet を「ハードリセット」する必要がある場合があります。

Valet のアップグレード

ターミナルで composer global require laravel/valet コマンドを実行することで、Valet のインストールを更新できます。アップグレード後は、valet install コマンドを実行して、Valet が必要に応じて構成ファイルに追加のアップグレードを行えるようにすることが良い習慣です。

Valet 4 へのアップグレード

Valet 3 から Valet 4 にアップグレードする場合は、Valet のインストールを適切にアップグレードするために以下の手順を実行してください:

  • サイトの PHP バージョンをカスタマイズするために .valetphprc ファイルを追加した場合は、各 .valetphprc ファイルの名前を .valetrc に変更します。次に、php=.valetrc ファイルの既存の内容の前に追加します。
  • カスタムドライバーを更新して、新しいドライバーシステムの名前空間、拡張子、型ヒント、および戻り型ヒントに一致させます。Valet の SampleValetDriver を例として参照できます。
  • PHP 7.1 - 7.4 を使用してサイトを提供している場合は、Homebrew を使用して PHP のバージョン 8.0 以上をインストールしていることを確認してください。Valet はこのバージョンを使用します。たとえそれがあなたの主要なリンクされたバージョンでなくても、いくつかのスクリプトを実行するために使用されます。

サイトの提供

Valet がインストールされたら、Laravel アプリケーションの提供を開始する準備が整いました。Valet は、アプリケーションを提供するための 2 つのコマンドを提供します: parklink

park コマンド

park コマンドは、アプリケーションを含むマシン上のディレクトリを登録します。ディレクトリが Valet で「パーク」されると、そのディレクトリ内のすべてのディレクトリに http://<directory-name>.test でアクセスできるようになります:

  1. cd ~/Sites
  2. valet park

それがすべてです。今、あなたの「パーク」されたディレクトリ内に作成したアプリケーションは、http://<directory-name>.test 規約を使用して自動的に提供されます。したがって、パークされたディレクトリに「laravel」という名前のディレクトリが含まれている場合、そのディレクトリ内のアプリケーションには http://laravel.test でアクセスできます。さらに、Valet は自動的にワイルドカードサブドメイン (http://foo.laravel.test) を使用してサイトにアクセスできるようにします。

link コマンドも Laravel アプリケーションを提供するために使用できます。このコマンドは、ディレクトリ全体ではなく、ディレクトリ内の単一のサイトを提供したい場合に便利です:

  1. cd ~/Sites/laravel
  2. valet link

アプリケーションが link コマンドを使用して Valet にリンクされると、そのアプリケーションにはディレクトリ名を使用してアクセスできます。したがって、上記の例でリンクされたサイトには http://laravel.test でアクセスできます。さらに、Valet は自動的にワイルドカードサブドメイン (http://foo.laravel.test) を使用してサイトにアクセスできるようにします。

異なるホスト名でアプリケーションを提供したい場合は、link コマンドにホスト名を渡すことができます。たとえば、次のコマンドを実行して http://application.test でアプリケーションを利用可能にすることができます:

  1. cd ~/Sites/laravel
  2. valet link application

もちろん、link コマンドを使用してサブドメインでアプリケーションを提供することもできます:

  1. valet link api.application

links コマンドを実行して、リンクされたディレクトリのリストを表示できます:

  1. valet links

unlink コマンドを使用してサイトのシンボリックリンクを削除できます:

  1. cd ~/Sites/laravel
  2. valet unlink

TLS でサイトを保護する

デフォルトでは、Valet は HTTP 経由でサイトを提供します。ただし、HTTP/2 を使用して暗号化された TLS 経由でサイトを提供したい場合は、secure コマンドを使用できます。たとえば、Valet が laravel.test ドメインでサイトを提供している場合、次のコマンドを実行してそれを保護する必要があります:

  1. valet secure laravel

サイトを「非保護」にして、通常の HTTP 経由でトラフィックを提供するには、unsecure コマンドを使用します。secure コマンドと同様に、このコマンドは非保護にしたいホスト名を受け入れます:

  1. valet unsecure laravel

デフォルトサイトの提供

時々、未知の 404 ドメインを訪問する際に、Valet を「デフォルト」サイトを提供するように構成したい場合があります。これを実現するには、~/.config/valet/config.json 構成ファイルに default オプションを追加し、デフォルトサイトとして提供するサイトのパスを含めることができます:

  1. "default": "/Users/Sally/Sites/example-site",

サイトごとの PHP バージョン

デフォルトでは、Valet はグローバル PHP インストールを使用してサイトを提供します。ただし、さまざまなサイトで複数の PHP バージョンをサポートする必要がある場合は、isolate コマンドを使用して特定のサイトが使用する PHP バージョンを指定できます。isolate コマンドは、現在の作業ディレクトリにあるサイトに指定された PHP バージョンを使用するように Valet を構成します:

  1. cd ~/Sites/example-site
  2. valet isolate

サイト名がそれを含むディレクトリの名前と一致しない場合は、--site オプションを使用してサイト名を指定できます:

  1. valet isolate --site="site-name"

便利なことに、valet phpcomposer、および which-php コマンドを使用して、サイトの構成された PHP バージョンに基づいて適切な PHP CLI またはツールへの呼び出しをプロキシできます:

  1. valet php
  2. valet composer
  3. valet which-php

isolated コマンドを実行して、すべての孤立したサイトとその PHP バージョンのリストを表示できます:

  1. valet isolated

サイトを Valet のグローバルにインストールされた PHP バージョンに戻すには、サイトのルートディレクトリから unisolate コマンドを実行できます:

  1. valet unisolate

サイトの共有

Valet には、ローカルサイトを世界と共有するためのコマンドが含まれており、モバイルデバイスでサイトをテストしたり、チームメンバーやクライアントと共有したりする簡単な方法を提供します。

初期設定では、Valet は ngrok または Expose を介してサイトを共有することをサポートしています。サイトを共有する前に、share-tool コマンドを使用して Valet 構成を更新し、ngrok または expose のいずれかを指定する必要があります:

  1. valet share-tool ngrok

ツールを選択し、Homebrew (ngrok 用) または Composer (Expose 用) を介してインストールしていない場合、Valet は自動的にインストールを促します。もちろん、両方のツールは、サイトを共有する前に ngrok または Expose アカウントを認証する必要があります。

サイトを共有するには、ターミナルでサイトのディレクトリに移動し、Valet の share コマンドを実行します。公開可能な URL がクリップボードにコピーされ、ブラウザに直接貼り付けたり、チームと共有したりする準備が整います:

  1. cd ~/Sites/laravel
  2. valet share

サイトの共有を停止するには、Control + C を押すことができます。

カスタム DNS サーバー (例えば 1.1.1.1) を使用している場合、ngrok 共有が正しく機能しない場合があります。この場合、Mac のシステム設定を開き、ネットワーク設定に移動し、詳細設定を開き、DNS タブに移動して、127.0.0.1 を最初の DNS サーバーとして追加する必要があります。

ngrok を介したサイトの共有

ngrok を使用してサイトを共有するには、ngrok アカウントを作成する認証トークンを設定する 必要があります。認証トークンを取得したら、そのトークンで Valet 構成を更新できます:

  1. valet set-ngrok-token YOUR_TOKEN_HERE

追加の ngrok パラメータを共有コマンドに渡すことができます。たとえば valet share --region=eu などです。詳細については、ngrok ドキュメント を参照してください。

Expose を介したサイトの共有

Expose を使用してサイトを共有するには、Expose アカウントを作成する認証トークンを介して Expose に認証する 必要があります。

追加のコマンドラインパラメータに関する情報は、Expose ドキュメント を参照してください。

ローカルネットワーク上でのサイトの共有

Valet は、デフォルトで内部 127.0.0.1 インターフェースへの受信トラフィックを制限しているため、開発マシンがインターネットからのセキュリティリスクにさらされないようにしています。

ローカルネットワーク上の他のデバイスが、マシンの IP アドレス (例: 192.168.1.10/application.test) を介して Valet サイトにアクセスできるようにするには、そのサイトの適切な Nginx 構成ファイルを手動で編集して listen ディレクティブの制限を削除する必要があります。ポート 80 および 443 の 127.0.0.1: ディレクティブのプレフィックスを削除する必要があります。

プロジェクトで valet secure を実行していない場合は、/usr/local/etc/nginx/valet/valet.conf ファイルを編集することで、すべての非 HTTPS サイトのネットワークアクセスを開放できます。ただし、プロジェクトサイトを HTTPS 経由で提供している場合 (サイトのために valet secure を実行している場合)、~/.config/valet/Nginx/app-name.test ファイルを編集する必要があります。

Nginx 構成を更新したら、valet restart コマンドを実行して構成変更を適用します。

サイト固有の環境変数

他のフレームワークを使用している一部のアプリケーションは、サーバー環境変数に依存していますが、それらの変数をプロジェクト内で構成する方法を提供していません。Valet は、プロジェクトのルートに .valet-env.php ファイルを追加することで、サイト固有の環境変数を構成できるようにします。このファイルは、配列のサイト / 環境変数ペアを返し、配列に指定された各サイトのグローバル $_SERVER 配列に追加されます:

  1. <?php
  2. return [
  3. // Set $_SERVER['key'] to "value" for the laravel.test site...
  4. 'laravel' => [
  5. 'key' => 'value',
  6. ],
  7. // Set $_SERVER['key'] to "value" for all sites...
  8. '*' => [
  9. 'key' => 'value',
  10. ],
  11. ];

サービスのプロキシ

時々、Valet ドメインをローカルマシンの別のサービスにプロキシしたい場合があります。たとえば、Valet を実行しながら、Docker で別のサイトを実行する必要がある場合があります。ただし、Valet と Docker は同時にポート 80 にバインドできません。

これを解決するには、proxy コマンドを使用してプロキシを生成できます。たとえば、http://elasticsearch.test から http://127.0.0.1:9200 へのすべてのトラフィックをプロキシできます:

  1. # HTTP 経由のプロキシ...
  2. valet proxy elasticsearch http://127.0.0.1:9200
  3. # TLS + HTTP/2 経由のプロキシ...
  4. valet proxy elasticsearch http://127.0.0.1:9200 --secure

unproxy コマンドを使用してプロキシを削除できます:

  1. valet unproxy elasticsearch

proxies コマンドを使用して、プロキシされたすべてのサイト構成をリストできます:

  1. valet proxies

カスタム Valet ドライバー

Valet にネイティブにサポートされていないフレームワークや CMS で実行される PHP アプリケーションを提供するために、独自の Valet「ドライバー」を作成できます。Valet をインストールすると、~/.config/valet/Drivers ディレクトリが作成され、SampleValetDriver.php ファイルが含まれます。このファイルには、カスタムドライバーの書き方を示すサンプルドライバー実装が含まれています。ドライバーを書くには、servesisStaticFilefrontControllerPath の 3 つのメソッドを実装するだけで済みます。

すべてのメソッドは、$sitePath$siteName$uri の値を引数として受け取ります。$sitePath は、マシン上で提供されているサイトへの完全修飾パスです。たとえば /Users/Lisa/Sites/my-project のようになります。$siteName は、ドメインの「ホスト」/「サイト名」部分 (my-project) です。$uri は、受信リクエスト URI (/foo/bar) です。

カスタム Valet ドライバーが完成したら、~/.config/valet/Drivers ディレクトリに FrameworkValetDriver.php 命名規則を使用して配置します。たとえば、WordPress 用のカスタム Valet ドライバーを書く場合、ファイル名は WordPressValetDriver.php である必要があります。

カスタム Valet ドライバーが実装すべき各メソッドのサンプル実装を見てみましょう。

serves メソッド

serves メソッドは、ドライバーが受信リクエストを処理する必要がある場合 true を返す必要があります。そうでない場合は、メソッドは false を返す必要があります。したがって、このメソッド内で、指定された $sitePath が提供しようとしているプロジェクトのタイプを含んでいるかどうかを判断しようとする必要があります。

たとえば、WordPressValetDriver を作成していると想像してみましょう。私たちの serves メソッドは次のようになるかもしれません:

  1. /**
  2. * Determine if the driver serves the request.
  3. */
  4. public function serves(string $sitePath, string $siteName, string $uri): bool
  5. {
  6. return is_dir($sitePath.'/wp-admin');
  7. }

isStaticFile メソッド

isStaticFile は、受信リクエストが画像やスタイルシートなどの「静的」ファイルであるかどうかを判断する必要があります。ファイルが静的である場合、メソッドはディスク上の静的ファイルへの完全修飾パスを返す必要があります。受信リクエストが静的ファイルでない場合、メソッドは false を返す必要があります:

  1. /**
  2. * Determine if the incoming request is for a static file.
  3. *
  4. * @return string|false
  5. */
  6. public function isStaticFile(string $sitePath, string $siteName, string $uri)
  7. {
  8. if (file_exists($staticFilePath = $sitePath.'/public/'.$uri)) {
  9. return $staticFilePath;
  10. }
  11. return false;
  12. }

isStaticFile メソッドは、serves メソッドが受信リクエストに対して true を返す場合にのみ呼び出され、リクエスト URI が / でない場合に呼び出されます。

frontControllerPath メソッド

frontControllerPath メソッドは、アプリケーションの「フロントコントローラー」への完全修飾パスを返す必要があります。通常は「index.php」ファイルまたは同等のものです:

  1. /**
  2. * Get the fully resolved path to the application's front controller.
  3. */
  4. public function frontControllerPath(string $sitePath, string $siteName, string $uri): string
  5. {
  6. return $sitePath.'/public/index.php';
  7. }

ローカルドライバー

単一のアプリケーション用にカスタム Valet ドライバーを定義したい場合は、アプリケーションのルートディレクトリに LocalValetDriver.php ファイルを作成します。カスタムドライバーは、基本 ValetDriver クラスを拡張するか、LaravelValetDriver のような既存のアプリケーション固有のドライバーを拡張できます:

  1. use Valet\Drivers\LaravelValetDriver;
  2. class LocalValetDriver extends LaravelValetDriver
  3. {
  4. /**
  5. * Determine if the driver serves the request.
  6. */
  7. public function serves(string $sitePath, string $siteName, string $uri): bool
  8. {
  9. return true;
  10. }
  11. /**
  12. * Get the fully resolved path to the application's front controller.
  13. */
  14. public function frontControllerPath(string $sitePath, string $siteName, string $uri): string
  15. {
  16. return $sitePath.'/public_html/index.php';
  17. }
  18. }

その他の Valet コマンド

コマンド 説明
valet list すべての Valet コマンドのリストを表示します。
valet diagnose Valet のデバッグを支援するための診断を出力します。
valet directory-listing ディレクトリリストの動作を決定します。デフォルトは「オフ」で、ディレクトリに対して 404 ページをレンダリングします。
valet forget 「パーク」されたディレクトリからこのコマンドを実行して、パークされたディレクトリリストから削除します。
valet log Valet のサービスによって書き込まれたログのリストを表示します。
valet paths すべての「パーク」されたパスを表示します。
valet restart Valet デーモンを再起動します。
valet start Valet デーモンを開始します。
valet stop Valet デーモンを停止します。
valet trust Brew と Valet のための sudoers ファイルを追加して、Valet コマンドをパスワードを求めずに実行できるようにします。
valet uninstall Valet をアンインストールします:手動アンインストールの手順を表示します。--force オプションを渡すと、Valet のすべてのリソースを強制的に削除します。

Valet ディレクトリとファイル

Valet 環境の問題をトラブルシューティングする際に、以下のディレクトリおよびファイル情報が役立つ場合があります。

~/.config/valet

Valet のすべての構成が含まれています。このディレクトリのバックアップを維持することをお勧めします。

~/.config/valet/dnsmasq.d/

このディレクトリには DNSMasq の構成が含まれています。

~/.config/valet/Drivers/

このディレクトリには Valet のドライバーが含まれています。ドライバーは、特定のフレームワーク / CMS がどのように提供されるかを決定します。

~/.config/valet/Nginx/

このディレクトリには Valet のすべての Nginx サイト構成が含まれています。これらのファイルは、install および secure コマンドを実行すると再構築されます。

~/.config/valet/Sites/

このディレクトリには、リンクされたプロジェクト のすべてのシンボリックリンクが含まれています。

~/.config/valet/config.json

このファイルは Valet のマスター構成ファイルです。

~/.config/valet/valet.sock

このファイルは Valet の Nginx インストールで使用される PHP-FPM ソケットです。PHP が正常に実行されている場合にのみ存在します。

~/.config/valet/Log/fpm-php.www.log

このファイルは PHP エラーのユーザーログです。

~/.config/valet/Log/nginx-error.log

このファイルは Nginx エラーのユーザーログです。

/usr/local/var/log/php-fpm.log

このファイルは PHP-FPM エラーのシステムログです。

/usr/local/var/log/nginx

このディレクトリには Nginx アクセスおよびエラーログが含まれています。

/usr/local/etc/php/X.X/conf.d

このディレクトリには、さまざまな PHP 構成設定の *.ini ファイルが含まれています。

/usr/local/etc/php/X.X/php-fpm.d/valet-fpm.conf

このファイルは PHP-FPM プールの構成ファイルです。

~/.composer/vendor/laravel/valet/cli/stubs/secure.valet.conf

このファイルは、サイトの SSL 証明書を構築するために使用されるデフォルトの Nginx 構成です。

ディスクアクセス

macOS 10.14 以降、一部のファイルおよびディレクトリへのアクセスはデフォルトで制限されています。これらの制限には、デスクトップ、ドキュメント、およびダウンロードディレクトリが含まれます。さらに、ネットワークボリュームおよびリムーバブルボリュームへのアクセスも制限されています。したがって、Valet はサイトフォルダーがこれらの保護された場所の外にあることを推奨します。

ただし、これらの場所のいずれかからサイトを提供したい場合は、Nginx に「フルディスクアクセス」を付与する必要があります。そうしないと、Nginx からサーバーエラーやその他の予測不可能な動作が発生する可能性があります。特に静的アセットを提供する場合は、特にそうです。通常、macOS は自動的に Nginx にこれらの場所へのフルアクセスを付与するように促します。または、System Preferences
> Security & Privacy
> Privacy を手動で行い、Full Disk Access を選択することもできます。次に、メインウィンドウペインで nginx エントリを有効にします。