Laravel Valet
イントロダクション
macOSやWindowsでLaravelアプリケーションを開発する、さらに簡単な方法をお探しですか?Laravel Herdをチェックしてください。Herdには、Valet、PHP、Composerなど、Laravel開発を始めるために必要なすべてが含まれています。
Laravel Valetは、macOSのミニマリストのための開発環境です。Laravel Valetは、Macが起動したときに常にバックグラウンドでNginxが実行されるように設定します。そして、DnsMasqを使用して、Valetは*.testドメインへのすべてのリクエストを、ローカルマシンにインストールされているサイトにプロキシします。
言い換えれば、ValetはRAMを約7MBしか使用しない、非常に高速なLaravel開発環境です。ValetはSailやHomesteadを完全に置き換えるものではありませんが、柔軟な基本機能を求めている場合、極端な速度を好む場合、またはRAMの量が限られているマシンで作業している場合に、優れた代替手段を提供します。
Valetは、すぐに使える状態で以下のものなどをサポートしています。
しかし、独自のカスタムドライバでValetを拡張することもできます。
インストール
ValetにはmacOSとHomebrewが必要です。インストールする前に、ApacheやNginxなどの他のプログラムがローカルマシンのポート80にバインドされていないことを確認してください。
まず、updateコマンドを使用してHomebrewが最新であることを確認する必要があります。
1brew update
次に、Homebrewを使用してPHPをインストールします。
1brew install php
PHPをインストールしたら、Composerパッケージマネージャをインストールする準備ができます。さらに、$HOME/.composer/vendor/binディレクトリがシステムの「PATH」に含まれていることを確認してください。Composerをインストールしたら、Laravel ValetをグローバルComposerパッケージとしてインストールできます。
1composer global require laravel/valet
最後に、Valetのinstallコマンドを実行します。これにより、ValetとDnsMasqが設定およびインストールされます。さらに、Valetが依存するデーモンは、システム起動時に起動するように設定されます。
1valet install
Valetをインストールしたら、ping foobar.testのようなコマンドを使用して、ターミナルから任意の*.testドメインにpingを試してください。Valetが正しくインストールされていれば、このドメインが127.0.0.1で応答するのがわかるはずです。
Valetは、マシンが起動するたびに必要なサービスを自動的に開始します。
PHPバージョン
グローバルなPHPバージョンを変更する代わりに、isolateコマンドを使用して、サイトごとにPHPバージョンを使用するようにValetに指示できます。
Valetでは、valet use php@versionコマンドを使用してPHPのバージョンを切り替えることができます。Valetは、指定されたPHPバージョンがまだインストールされていない場合、Homebrewを介してインストールします。
2 3valet use php
プロジェクトのルートに.valetrcファイルを作成することもできます。.valetrcファイルには、サイトが使用するPHPのバージョンを記述します。
1php=php@8.2
このファイルを作成したら、valet useコマンドを実行するだけで、コマンドはファイルを読み取ってサイトの優先PHPバージョンを決定します。
複数のPHPバージョンがインストールされていても、Valetは一度に1つのPHPバージョンしか提供しません。
データベース
アプリケーションでデータベースが必要な場合は、MySQL、PostgreSQL、Redisを含む無料のオールインワンデータベース管理ツールを提供するDBnginをチェックしてください。DBnginをインストールした後、rootユーザー名と空の文字列のパスワードを使用して127.0.0.1でデータベースに接続できます。
インストールのリセット
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に変更します。次に、.valetrcファイルの既存のコンテンツの前にphp=を追加します。 - 新しいドライバシステムの名前空間、拡張子、型ヒント、および戻り値の型ヒントに合わせて、カスタムドライバを更新します。例として、ValetのSampleValetDriverを参照できます。
- PHP 7.1〜7.4を使用してサイトをサーブしている場合は、Valetがいくつかのスクリプトを実行するためにこのバージョン(プライマリリンクされたバージョンでなくても)を使用するため、必ずHomebrewを使用してバージョン8.0以上のPHPをインストールしてください。
サイトのサーブ
Valetがインストールされたら、Laravelアプリケーションのサーブを開始する準備ができました。Valetには、アプリケーションをサーブするのに役立つ2つのコマンド、parkとlinkがあります。
parkコマンド
parkコマンドは、アプリケーションを含むマシン上のディレクトリを登録します。ディレクトリがValetで「park」されると、そのディレクトリ内のすべてのディレクトリがWebブラウザでhttp://<directory-name>.testでアクセスできるようになります。
1cd ~/Sites2 3valet park
これだけです。「park」したディレクトリ内に作成したアプリケーションは、http://<directory-name>.testの規約を使用して自動的にサーブされます。したがって、parkされたディレクトリに「laravel」という名前のディレクトリが含まれている場合、そのディレクトリ内のアプリケーションはhttp://laravel.testでアクセスできます。さらに、Valetはワイルドカードサブドメイン(http://foo.laravel.test)を使用してサイトにアクセスすることも自動的に許可します。
linkコマンド
linkコマンドを使用して、Laravelアプリケーションをサーブすることもできます。このコマンドは、ディレクトリ全体ではなく、ディレクトリ内の単一のサイトをサーブしたい場合に便利です。
1cd ~/Sites/laravel2 3valet link
アプリケーションがlinkコマンドを使用してValetにリンクされると、そのディレクトリ名を使用してアプリケーションにアクセスできます。したがって、上記の例でリンクされたサイトはhttp://laravel.testでアクセスできます。さらに、Valetはワイルドカードサブドメイン(http://foo.laravel.test)を使用してサイトにアクセスすることも自動的に許可します。
アプリケーションを別のホスト名でサーブしたい場合は、ホスト名をlinkコマンドに渡すことができます。たとえば、次のコマンドを実行して、アプリケーションをhttp://application.testで利用できるようにすることができます。
1cd ~/Sites/laravel2 3valet link application
もちろん、linkコマンドを使用してサブドメインでアプリケーションをサーブすることもできます。
1valet link api.application
linksコマンドを実行して、リンクされているすべてのディレクトリのリストを表示できます。
1valet links
unlinkコマンドを使用して、サイトのシンボリックリンクを破棄できます。
1cd ~/Sites/laravel2 3valet unlink
TLSによるサイトの保護
デフォルトでは、ValetはHTTPを介してサイトをサーブします。ただし、HTTP/2を使用して暗号化されたTLSを介してサイトをサーブしたい場合は、secureコマンドを使用できます。たとえば、サイトがValetによってlaravel.testドメインでサーブされている場合は、次のコマンドを実行して保護する必要があります。
1valet secure laravel
サイトを「unsecure」にして、トラフィックをプレーンなHTTPでサーブするように戻すには、unsecureコマンドを使用します。secureコマンドと同様に、このコマンドはunsecureにしたいホスト名を受け入れます。
1valet unsecure laravel
デフォルトサイトのサーブ
不明なtestドメインにアクセスしたときに、404ではなく「デフォルト」サイトをサーブするようにValetを設定したい場合があります。これを実現するには、~/.config/valet/config.json設定ファイルに、デフォルトサイトとしてサーブするサイトへのパスを含むdefaultオプションを追加します。
1"default": "/Users/Sally/Sites/example-site",
サイトごとのPHPバージョン
デフォルトでは、ValetはグローバルなPHPインストールを使用してサイトをサーブします。ただし、さまざまなサイトで複数のPHPバージョンをサポートする必要がある場合は、isolateコマンドを使用して、特定のサイトが使用するPHPバージョンを指定できます。isolateコマンドは、現在の作業ディレクトリにあるサイトに対して、指定されたPHPバージョンを使用するようにValetを設定します。
1cd ~/Sites/example-site2
サイト名がそれを含むディレクトリの名前と一致しない場合は、--siteオプションを使用してサイト名を指定できます。
便宜上、valet php、composer、およびwhich-phpコマンドを使用して、サイトに設定されたPHPバージョンに基づいて、適切なPHP CLIまたはツールへの呼び出しをプロキシできます。
1valet php2valet composer3valet which-php
isolatedコマンドを実行すると、すべての分離されたサイトとそのPHPバージョンのリストを表示できます。
1valet isolated
サイトをValetのグローバルにインストールされたPHPバージョンに戻すには、サイトのルートディレクトリからunisolateコマンドを呼び出します。
1valet unisolate
サイトの共有
Valetには、ローカルサイトを世界と共有するコマンドが含まれており、モバイルデバイスでサイトをテストしたり、チームメンバーやクライアントと共有したりする簡単な方法を提供します。
すぐに使える状態で、ValetはngrokまたはExposeを介したサイトの共有をサポートしています。サイトを共有する前に、share-toolコマンドを使用してValetの設定を更新し、ngrokまたはexposeのいずれかを指定する必要があります。
1valet share-tool ngrok
ツールを選択し、Homebrew(ngrokの場合)またはComposer(Exposeの場合)を介してインストールしていない場合、Valetは自動的にインストールを促します。もちろん、両方のツールでサイトの共有を開始する前に、ngrokまたはExposeアカウントを認証する必要があります。
サイトを共有するには、ターミナルでサイトのディレクトリに移動し、Valetのshareコマンドを実行します。公にアクセス可能なURLがクリップボードに配置され、ブラウザに直接貼り付けたり、チームと共有したりする準備ができます。
1cd ~/Sites/laravel2 3valet share
サイトの共有を停止するには、Control + Cを押します。
カスタムDNSサーバ(1.1.1.1など)を使用している場合、ngrok共有が正しく機能しない場合があります。お使いのマシンでこの問題が発生した場合は、Macのシステム設定を開き、ネットワーク設定に移動し、詳細設定を開き、DNSタブに移動して、最初のDNSサーバとして127.0.0.1を追加してください。
Ngrokによるサイトの共有
ngrokを使用してサイトを共有するには、ngrokアカウントを作成し、認証トークンを設定する必要があります。認証トークンを取得したら、そのトークンでValetの設定を更新できます。
1valet set-ngrok-token YOUR_TOKEN_HERE
valet share --region=euなど、追加のngrokパラメータを共有コマンドに渡すことができます。詳細については、ngrokのドキュメントを参照してください。
Exposeによるサイトの共有
Exposeを使用してサイトを共有するには、Exposeアカウントを作成し、認証トークンを介してExposeで認証する必要があります。
サポートされている追加のコマンドラインパラメータに関する情報については、Exposeのドキュメントを参照してください。
ローカルネットワークでのサイト共有
Valetは、開発マシンがインターネットからのセキュリティリスクにさらされないように、デフォルトで着信トラフィックを内部の127.0.0.1インターフェイスに制限します。
ローカルネットワーク上の他のデバイスが、マシンのIPアドレス(例:192.168.1.10/application.test)を介してマシン上のValetサイトにアクセスできるようにしたい場合は、そのサイトの適切なNginx設定ファイルを手動で編集して、listenディレクティブの制限を削除する必要があります。ポート80と443のlistenディレクティブから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 3return [ 4 // Set $_SERVER['key'] to "value" for the laravel.test site... 5 'laravel' => [ 6 'key' => 'value', 7 ], 8 9 // Set $_SERVER['key'] to "value" for all sites...10 '*' => [11 'key' => 'value',12 ],13];
サービスのプロキシ
Valetドメインをローカルマシンの別のサービスにプロキシしたい場合があります。たとえば、Valetを実行しながらDockerで別のサイトを実行する必要がある場合があります。しかし、ValetとDockerは同時にポート80にバインドすることはできません。
これを解決するには、proxyコマンドを使用してプロキシを生成します。たとえば、http://elasticsearch.testからのすべてのトラフィックをhttp://127.0.0.1:9200にプロキシすることができます。
1# Proxy over HTTP...2valet proxy elasticsearch http://127.0.0.1:92003 4# Proxy over TLS + HTTP/2...5valet proxy elasticsearch http://127.0.0.1:9200 --secure
unproxyコマンドを使用してプロキシを削除できます。
1valet unproxy elasticsearch
proxiesコマンドを使用して、プロキシされているすべてのサイト設定を一覧表示できます。
1valet proxies
カスタムValetドライバ
ValetでネイティブにサポートされていないフレームワークやCMSで実行されているPHPアプリケーションをサーブするために、独自のValet「ドライバ」を作成できます。Valetをインストールすると、~/.config/valet/Driversディレクトリが作成され、その中にSampleValetDriver.phpファイルが含まれています。このファイルには、カスタムドライバの作成方法を示すサンプルドライバの実装が含まれています。ドライバを作成するには、serves、isStaticFile、frontControllerPathの3つのメソッドを実装するだけです。
3つのメソッドはすべて、引数として$sitePath、$siteName、および$uriの値を受け取ります。$sitePathは、マシン上でサーブされているサイトへの完全修飾パスです(例:/Users/Lisa/Sites/my-project)。$siteNameは、ドメインの「ホスト」/「サイト名」部分です(my-project)。$uriは、着信リクエストURIです(/foo/bar)。
カスタムValetドライバが完成したら、FrameworkValetDriver.phpという命名規則を使用して~/.config/valet/Driversディレクトリに配置します。たとえば、WordPress用のカスタムValetドライバを作成している場合、ファイル名はWordPressValetDriver.phpになります。
カスタムValetドライバが実装すべき各メソッドのサンプル実装を見てみましょう。
servesメソッド
servesメソッドは、ドライバが着信リクエストを処理すべき場合にtrueを返す必要があります。それ以外の場合は、メソッドはfalseを返す必要があります。したがって、このメソッド内では、指定された$sitePathに、サーブしようとしているタイプのプロジェクトが含まれているかどうかを判断しようと試みる必要があります。
たとえば、WordPressValetDriverを作成しているとします。私たちのservesメソッドは次のようになるでしょう。
1/**2 * Determine if the driver serves the request.3 */4public function serves(string $sitePath, string $siteName, string $uri): bool5{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 */ 6public function isStaticFile(string $sitePath, string $siteName, string $uri) 7{ 8 if (file_exists($staticFilePath = $sitePath.'/public/'.$uri)) { 9 return $staticFilePath;10 }11 12 return false;13}
isStaticFileメソッドは、servesメソッドが着信リクエストに対してtrueを返し、リクエストURIが/でない場合にのみ呼び出されます。
frontControllerPathメソッド
frontControllerPathメソッドは、アプリケーションの「フロントコントローラ」への完全修飾パスを返す必要があります。これは通常、「index.php」ファイルまたは同等のものです。
1/**2 * Get the fully resolved path to the application's front controller.3 */4public function frontControllerPath(string $sitePath, string $siteName, string $uri): string5{6 return $sitePath.'/public/index.php';7}
ローカルドライバ
単一のアプリケーション用にカスタムValetドライバを定義したい場合は、アプリケーションのルートディレクトリにLocalValetDriver.phpファイルを作成します。カスタムドライバは、ベースのValetDriverクラスを拡張するか、LaravelValetDriverなどの既存のアプリケーション固有のドライバを拡張することができます。
1use Valet\Drivers\LaravelValetDriver; 2 3class LocalValetDriver extends LaravelValetDriver 4{ 5 /** 6 * Determine if the driver serves the request. 7 */ 8 public function serves(string $sitePath, string $siteName, string $uri): bool 9 {10 return true;11 }12 13 /**14 * Get the fully resolved path to the application's front controller.15 */16 public function frontControllerPath(string $sitePath, string $siteName, string $uri): string17 {18 return $sitePath.'/public_html/index.php';19 }20}
その他のValetコマンド
| コマンド | 説明 |
|---|---|
valet list |
すべてのValetコマンドのリストを表示します。 |
valet diagnose |
Valetのデバッグに役立つ診断情報を出力します。 |
valet directory-listing |
ディレクトリ一覧の動作を決定します。デフォルトは「off」で、ディレクトリに対して404ページを表示します。 |
valet forget |
「park」されたディレクトリからこのコマンドを実行して、parkされたディレクトリリストから削除します。 |
valet log |
Valetのサービスによって書き込まれたログのリストを表示します。 |
valet paths |
すべての「park」されたパスを表示します。 |
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にこれらの場所へのフルアクセスを許可するように自動的に促します。または、システム環境設定 > セキュリティとプライバシー > プライバシーに移動し、フルディスクアクセスを選択して手動で行うこともできます。次に、メインウィンドウペインで任意のnginxエントリを有効にします。