#はじめに
macOSでLaravelアプリケーションをさらに簡単に開発したいですか?Laravel Herdをチェックしてください。HerdにはValet、PHP、Composerを含むLaravel開発に必要なすべてが揃っています。
Laravel ValetはmacOSのミニマリスト向け開発環境です。ValetはMacの起動時に常にNginxをバックグラウンドで実行するよう設定します。そして、DnsMasqを使って、*.testドメインへのすべてのリクエストをローカルマシンにインストールされたサイトにプロキシします。
つまり、Valetは約7MBのRAMしか使わない超高速なLaravel開発環境です。ValetはSailやHomesteadの完全な代替ではありませんが、柔軟な基本機能を求める場合や、極めて高速な環境が必要な場合、またはRAMが限られたマシンで作業する場合に優れた選択肢となります。
Valetが標準でサポートするものは以下に限りませんが、主に以下の通りです:
<style> #valet-support > ul { column-count: 3; -moz-column-count: 3; -webkit-column-count: 3; line-height: 1.9; } </style>ただし、独自のカスタムドライバーでValetを拡張することもできます。
#インストール
ValetはmacOSとHomebrewが必要です。インストール前に、ApacheやNginxなど他のプログラムがローカルマシンのポート80を使用していないことを確認してください。
始めるには、まずHomebrewが最新であることをupdateコマンドで確認してください:
brew update
次に、Homebrewを使ってPHPをインストールします:
brew install php
PHPをインストールしたら、Composerパッケージマネージャーをインストールする準備が整います。さらに、$HOME/.composer/vendor/binディレクトリがシステムの「PATH」に含まれていることを確認してください。Composerをインストールした後、Laravel ValetをグローバルComposerパッケージとしてインストールできます:
composer global require laravel/valet
最後に、Valetのinstallコマンドを実行します。これによりValetとDnsMasqが設定・インストールされ、Valetが依存するデーモンがシステム起動時に自動起動するよう設定されます:
valet install
Valetをインストールしたら、ターミナルでping foobar.testのように任意の*.testドメインにpingを試みてください。Valetが正しくインストールされていれば、127.0.0.1で応答が返ってきます。
Valetはマシンの起動時に必要なサービスを自動的に開始します。
#PHPバージョン
グローバルなPHPバージョンを変更する代わりに、isolate コマンドを使ってサイトごとのPHPバージョンを指定できます。
Valetはvalet use php@versionコマンドでPHPバージョンを切り替えられます。指定したPHPバージョンがインストールされていない場合は、Homebrewを使って自動的にインストールします:
valet use [email protected]
valet use php
プロジェクトのルートに.valetrcファイルを作成することもできます。.valetrcファイルには、そのサイトが使用するPHPのバージョンを記述してください:
[email protected]
このファイルを作成したら、valet useコマンドを実行するだけで、ファイルを読み取ってサイトのPHPバージョンを自動的に判別します。
Valetは複数のPHPバージョンがインストールされていても、一度に1つのPHPバージョンしか提供しません。
#データベース
アプリケーションにデータベースが必要な場合は、MySQL、PostgreSQL、Redisを含む無料のオールインワンデータベース管理ツールDBnginを試してください。DBnginをインストールした後は、127.0.0.1のrootユーザー名と空のパスワードでデータベースに接続できます。
#インストールのリセット
Valetのインストールに問題がある場合は、composer global require laravel/valetを実行してからvalet installを実行するとインストールをリセットでき、多くの問題が解決します。まれにvalet uninstall --forceを実行してからvalet installで「ハードリセット」が必要になることもあります。
#Valetのアップグレード
Valetをアップデートするには、ターミナルでcomposer global require laravel/valetを実行します。アップグレード後は、設定ファイルの追加アップグレードが必要な場合に備えてvalet installを実行することを推奨します。
#Valet 4へのアップグレード
Valet 3からValet 4にアップグレードする場合は、以下の手順で正しくアップグレードしてください:
- サイトの PHP バージョンをカスタマイズするために
.valetphprcファイルを追加している場合は、各.valetphprcファイルの名前を.valetrcに変更してください。次に、既存の.valetrcファイルの内容の先頭にphp=を付けてください。 - カスタムドライバは、新しいドライバシステムの名前空間、拡張、型ヒント、および戻り値の型ヒントに合わせて更新してください。例として Valet の SampleValetDriver を参照できます。
- サイトの公開に PHP 7.1 - 7.4 を使用している場合でも、Homebrew で PHP 8.0 以上をインストールしておいてください。Valet は主要にリンクされたバージョンでなくても、このバージョンを使って一部のスクリプトを実行します。
#サイトの提供
Valetをインストールしたら、Laravelアプリケーションの提供を開始できます。Valetはアプリケーション提供を支援するためにparkとlinkの2つのコマンドを提供します。
#park コマンド
parkコマンドは、マシン上のアプリケーションが入ったディレクトリを登録します。一度ディレクトリをValetに「park」すると、そのディレクトリ内のすべてのディレクトリがhttp://<directory-name>.testでブラウザからアクセス可能になります:
cd ~/Sites
valet park
これだけです。これで「park」したディレクトリ内に作成したアプリケーションはすべてhttp://<directory-name>.testの形式で自動的に提供されます。例えば、parkしたディレクトリに「laravel」というディレクトリがあれば、その中のアプリケーションはhttp://laravel.testでアクセスできます。さらに、Valetはワイルドカードサブドメイン(http://foo.laravel.test)も自動的に許可します。
#link コマンド
linkコマンドもLaravelアプリケーションの提供に使えます。このコマンドは、ディレクトリ全体ではなく単一のサイトを提供したい場合に便利です:
cd ~/Sites/laravel
valet link
linkコマンドでアプリケーションをValetにリンクすると、そのディレクトリ名でアクセスできます。上記の例でリンクしたサイトはhttp://laravel.testでアクセス可能です。さらに、Valetはワイルドカードサブドメイン(http://foo.laravel.test)も自動的に許可します。
異なるホスト名でアプリケーションを提供したい場合は、linkコマンドにホスト名を渡せます。例えば、以下のコマンドでhttp://application.testでアプリケーションを利用可能にできます:
cd ~/Sites/laravel
valet link application
もちろん、linkコマンドを使ってサブドメインでアプリケーションを提供することも可能です:
valet link api.application
linksコマンドを実行すると、リンク済みのディレクトリ一覧が表示されます:
valet links
unlinkコマンドはサイトのシンボリックリンクを削除するために使います:
cd ~/Sites/laravel
valet unlink
#TLSでサイトを保護する
デフォルトではValetはHTTPでサイトを提供しますが、HTTP/2を使った暗号化されたTLSでサイトを提供したい場合はsecureコマンドを使います。例えば、Valetがlaravel.testドメインでサイトを提供している場合、以下のコマンドでサイトを保護できます:
valet secure laravel
サイトのセキュリティを解除してトラフィックの配信をプレーンなHTTPに戻すには、unsecure コマンドを使用します。secure コマンドと同様に、このコマンドは解除したいホスト名を受け取ります:
valet unsecure laravel
#デフォルトサイトの提供
未知のtestドメインにアクセスした際に404ではなく「デフォルト」サイトを提供したい場合は、~/.config/valet/config.jsonの設定ファイルにdefaultオプションを追加し、デフォルトサイトのパスを指定します:
"default": "/Users/Sally/Sites/example-site",
#サイトごとのPHPバージョン
デフォルトではValetはグローバルなPHPインストールを使ってサイトを提供しますが、複数のPHPバージョンをサイトごとに使い分けたい場合はisolateコマンドを使って特定のサイトで使うPHPバージョンを指定できます。isolateコマンドは現在の作業ディレクトリにあるサイトに対して指定したPHPバージョンを設定します:
cd ~/Sites/example-site
valet isolate [email protected]
サイト名がディレクトリ名と異なる場合は、--siteオプションでサイト名を指定できます:
valet isolate [email protected] --site="site-name"
利便性のために、valet php、composer、which-phpコマンドを使って、サイトの設定されたPHPバージョンに応じたPHP CLIやツールへの呼び出しをプロキシできます:
valet php
valet composer
valet which-php
isolatedコマンドを実行すると、分離されたすべてのサイトとそのPHPバージョンの一覧が表示されます:
valet isolated
サイトをValetのグローバルPHPバージョンに戻したい場合は、サイトのルートディレクトリでunisolateコマンドを実行します:
valet unisolate
#サイトの共有
Valetにはローカルサイトを外部に共有するコマンドがあり、モバイルデバイスでのテストやチームメンバー・クライアントとの共有が簡単にできます。
標準でValetはngrokまたはExposeを使ったサイト共有をサポートします。サイトを共有する前に、share-toolコマンドでngrokかexposeを指定してValetの設定を更新してください:
valet share-tool ngrok
ツールを選択してHomebrew(ngrok)やComposer(Expose)でインストールされていない場合、Valetが自動的にインストールを促します。もちろん、両ツールとも共有を開始する前にngrokまたはExposeのアカウント認証が必要です。
サイトを共有するには、ターミナルでサイトのディレクトリに移動し、Valetのshareコマンドを実行します。公開可能なURLがクリップボードにコピーされ、ブラウザに貼り付けたりチームと共有したりできます:
cd ~/Sites/laravel
valet share
共有を停止するには、Control + Cを押してください。
カスタムDNSサーバー(例:1.1.1.1)を使っている場合、ngrok共有が正しく動作しないことがあります。その場合はMacのシステム設定を開き、ネットワーク設定の詳細設定のDNSタブで127.0.0.1を最初のDNSサーバーとして追加してください。
#Ngrokを使ったサイト共有
ngrok を使ってサイトを共有するには、ngrok アカウントを作成し、認証トークンを設定する必要があります。認証トークンを取得したら、そのトークンを使って Valet の設定を更新できます。
valet set-ngrok-token YOUR_TOKEN_HERE
valet share --region=eu のように、share コマンドに追加の ngrok パラメータを渡すことができます。詳細は ngrok ドキュメントをご覧ください。
#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 を実行していない場合は、すべての非 HTTPS サイトのネットワークアクセスを /usr/local/etc/nginx/valet/valet.conf ファイルを編集して開放できます。ただし、HTTPS でサイトを提供している場合(valet secure を実行済みの場合)は、~/.config/valet/Nginx/app-name.test ファイルを編集してください。
Nginx 設定を更新したら、valet restart コマンドを実行して設定変更を反映させてください。
#サイト固有の環境変数
他のフレームワークを使うアプリケーションの中には、サーバーの環境変数に依存しているものの、プロジェクト内でそれらの変数を設定する方法を提供していない場合があります。Valet では、プロジェクトのルートに .valet-env.php ファイルを追加することで、サイト固有の環境変数を設定できます。このファイルは、サイトごとの環境変数のペアを配列で返し、指定された各サイトのグローバルな $_SERVER 配列に追加されます。
<?php
return [
// laravel.test サイトの $_SERVER['key'] に "value" を設定...
'laravel' => [
'key' => 'value',
],
// すべてのサイトの $_SERVER['key'] に "value" を設定...
'*' => [
'key' => 'value',
],
];
#サービスのプロキシ
Valet ドメインをローカルマシン上の別のサービスにプロキシしたい場合があります。例えば、Valet を使いながら別のサイトを Docker で動かす必要がある場合、Valet と Docker は同時にポート 80 をバインドできません。
この問題を解決するために、proxy コマンドでプロキシを作成できます。例えば、http://elasticsearch.test へのすべてのトラフィックを http://127.0.0.1:9200 にプロキシできます。
# HTTP 経由でプロキシ...
valet proxy elasticsearch http://127.0.0.1:9200
# TLS + HTTP/2 経由でプロキシ...
valet proxy elasticsearch http://127.0.0.1:9200 --secure
unproxy コマンドでプロキシを削除できます。
valet unproxy elasticsearch
proxies コマンドでプロキシ設定されているすべてのサイトを一覧表示できます。
valet 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 ドライバーを完成させたら、~/.config/valet/Drivers ディレクトリに FrameworkValetDriver.php という命名規則で配置してください。例えば、WordPress 用のカスタムドライバーならファイル名は WordPressValetDriver.php です。
カスタム Valet ドライバーで実装すべき各メソッドのサンプル実装を見てみましょう。
#serves メソッド
serves メソッドは、ドライバーがリクエストを処理すべき場合に true を返し、それ以外は false を返します。このメソッド内で、与えられた $sitePath に対象のプロジェクトが存在するかどうかを判定します。
例えば、WordPressValetDriver を作成するとしたら、serves メソッドは次のようになるかもしれません。
/**
* ドライバーがリクエストを処理するか判定します。
*/
public function serves(string $sitePath, string $siteName, string $uri): bool
{
return is_dir($sitePath.'/wp-admin');
}
#isStaticFile メソッド
isStaticFile メソッドは、リクエストが画像やスタイルシートなどの「静的」ファイルを要求しているか判定します。静的ファイルの場合は、そのファイルの完全なパスを返し、そうでなければ false を返します。
/**
* リクエストが静的ファイルか判定します。
*
* @return string|false
*/
public function isStaticFile(string $sitePath, string $siteName, string $uri)
{
if (file_exists($staticFilePath = $sitePath.'/public/'.$uri)) {
return $staticFilePath;
}
return false;
}
isStaticFile メソッドは、serves メソッドがリクエストに対して true を返し、かつリクエスト URI が / でない場合にのみ呼び出されます。
#frontControllerPath メソッド
frontControllerPath メソッドは、アプリケーションの「フロントコントローラー」への完全修飾パス(通常は "index.php" ファイルまたは同等のファイル)を返す必要があります:
/**
* アプリケーションのフロントコントローラーの完全なパスを取得します。
*/
public function frontControllerPath(string $sitePath, string $siteName, string $uri): string
{
return $sitePath.'/public/index.php';
}
#ローカルドライバー
単一のアプリケーション用にカスタム Valet ドライバーを定義したい場合は、アプリケーションのルートディレクトリに LocalValetDriver.php ファイルを作成してください。カスタムドライバーは基本の ValetDriver クラスを継承するか、LaravelValetDriver のような既存のアプリケーション固有ドライバーを継承できます。
use Valet\Drivers\LaravelValetDriver;
class LocalValetDriver extends LaravelValetDriver
{
/**
* ドライバーがリクエストを処理するか判定します。
*/
public function serves(string $sitePath, string $siteName, string $uri): bool
{
return true;
}
/**
* アプリケーションのフロントコントローラーの完全なパスを取得します。
*/
public function frontControllerPath(string $sitePath, string $siteName, string $uri): string
{
return $sitePath.'/public_html/index.php';
}
}
#その他の Valet コマンド
| Command | 説明 |
|---|---|
valet list |
すべての Valet コマンドの一覧を表示します。 |
valet diagnose |
Valet のデバッグに役立つ診断情報を出力します。 |
valet directory-listing |
ディレクトリリスティングの動作を設定します。デフォルトは「off」で、ディレクトリに対して 404 ページを表示します。 |
valet forget |
「parked」ディレクトリから実行して、そのディレクトリを parked ディレクトリリストから削除します。 |
valet log |
Valet のサービスが書き込むログの一覧を表示します。 |
valet paths |
すべての「parked」パスを表示します。 |
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 エントリを有効にしてください。