イントロダクション
Valet(ベレット:従者)はMacミニマニストのためのLaravel開発環境です。Vagrantも不要、/etc/hostsファイルも不要です。さらに、ローカルトンネルを使って、サイトを公開し、シェアすることもできます。ええ、私達はこういうのも好きなんですよね。
Laravel Valetはマシン起動時にバックグランドでNginxがいつも実行されるように、Macを設定します。そのため、DnsMasqを使用し、Valetは*.test
ドメインへの全リクエストを、ローカルマシンのインストール済みサイトへ向けるようにプロキシ動作します。
言い換えれば、大体7MBのRAMを使うとても早いLaravelの開発環境です。ValetはVagrantやHomesteadを完全に置き換えるものではありませんが柔軟な基礎、とくにスピード重視であるか、RAMが限られているマシンで動作させるのに素晴らしい代替になります。
Valetは以下をサポートしていますが、これらに限定されません。
独自のカスタムドライバでValetを拡張できます。
ValetとHomestead
ご存知のように、ローカルのLaravel開発環境としてHomesteadも用意しています。HomesteadとValetは利用者の目的とローカルの開発についてのアプローチが異なります。Homesteadは自動的にNginx設定を行うUbuntuの完全な仮想マシンを提供しています。HomesteadはLinux開発環境の完全な仮想化を行いたい、もしくはWindows/Linux上で動作させたい場合、素晴らしい選択肢になります。
ValetはMac上でのみサポートされ、PHPとデータベースサーバを直接ローカルマシンへインストールする必要があります。Homebrewを利用し、brew install php
とbrew install mysql
のようなコマンドを実行すれば、簡単にインストールできます。Valetは最低限度のリソースを使い、とても早いローカル開発環境を提供します。そのため、PHPとMySQLだけが必要で、完全な仮想開発環境は必要ない場合にぴったりです。
ValetとHomesteadのどちらを選んでも、Laravelの開発環境に向け設定されており、良い選択になるでしょう。どちらを選ぶかは、自分の好みとチームの必要により決まるでしょう。
インストール
ValetにはMacオペレーティングシステムとHomebrewが必要です。インストールする前に、ApacheやNginxのようなローカルマシンの80番ポートへバインドするプログラムがないことを確認してください。
brew update
で最新バージョンのHomebrewをインストール、もしくはアップデートしてください。- Homebrewを使い、
brew install php
でPHP7.4をインストールしてください。 - Composerをインストールしてください。
composer global require laravel/valet
でValetをインストールしてください。~/.composer/vendor/bin
ディレクトリが実行パスに含まれていることを確認してください。valet install
コマンドを実行してください。これによりValetとDnsMasqがインストール/設定され、システム起動時に起動されるValetのデーモンが登録されます。
Valetがインストールできたら、ping foobar.test
のようなコマンドで、ターミナルから*.test
ドメインに対してpingを実行してください。Valetが正しくインストールされていれば、このドメインは127.0.0.1
へ対応していることがわかるでしょう。
Valetはマシンが起動されると、毎回デーモンを自動的に起動します。Valetが完全にインストールされていれば、valet start
やvalet install
を再び実行する必要は永久にありません。
他のドメインの使用
デフォルトでValetは.test
TLDをプロジェクトのドメインとして処理します。他のドメインを使いたい場合、valet tld tld-name
コマンドを使ってください。
たとえば、.test
の代わりに.app
を使用したければ、valet tld app
と実行します。Valetは*.app
をプロジェクトのために自動的に使い始めます。
データベース
データベースを使いたい場合、コマンドラインでbrew install mysql@5.7
を実行し、MySQLを試してください。MySQLがインストールできたら、brew services start mysql@5.7
コマンドを使い、起動します。127.0.0.1
でデータベースに接続し、ユーザー名はroot
、パスワードは空文字列です。
PHPバージョン
Valetではvalet use php@version
コマンドにより、PHPバージョンを変更できます。指定されたPHPバージョンがインストールされていない場合、ValetはBrewによりインストールします。
valet use php@7.2
valet use php
Note: 複数のPHPバージョンをインストールしている場合でも、Valetは一度に一つのPHPバージョンのみを提供します。
インストレーションのリセット
Valetインストレーションが正しく動作せずに問題が起きた時は、composer global update
の後に、valet install
を実行してください。これによりインストール済みのValetがリセットされ、さまざまな問題が解決されます。稀にValetを「ハードリセット」する必要がある場合もあり、その場合はvalet install
の前にvalet uninstall --force
を実行してください。
アップグレード
Valetインストールをアップデートするには、ターミナルでcomposer global update
コマンドを実行します。アップグレードできたら、valet install
コマンドを実行し、必要な設定ファイルの追加アップグレードを行うのは、グッドプラクティスです。
サイト動作
Valetがインストールできたら、サイトを動作させる準備ができました。Laravelサイトを動作させるために役立つ、park
とlink
の2コマンドを用意しています。
park
コマンド
mkdir ~/Sites
のように、Mac上に新しいディレクトリを作成ししてください。次にcd ~/Sites
し、valet park
を実行します。このコマンドはカレントワーキングディレクトリをValetがサイトを探す親パスとして登録します。- 次に、このディレクトリ内で、新しいLaravelサイトを作成します。
laravel new blog
http://blog.test
をブラウザで開きます。
必要なのはこれだけです。
これで"parked"ディレクトリ内に作成されたLaravelプロジェクトは、http://フォルダ名.test
規約に従い、自動的に動作します。
link
コマンド
link
コマンドはpark
のように親ディレクトリを指定するのではなく、各ディレクトリ中で一つのサイトを動作させるのに便利です。
- ターミナルでプロジェクトのディレクトリへ移動し、
valet link アプリケーション名
を実行します。Valetはカレントワーキングディレクトリから~/.config/valet/Sites
内へシンボリックリンクを張ります。 link
コマンド実行後、ブラウザでhttp://アプリケーション名.test
にアクセスできます。
リンクされた全ディレクトリをリストするには、valet links
コマンドを実行してください。シンボリックリンクを外すときは、valet unlink app-name
を使います。
Tip!! 複数の(サブ)ドメインで同じプロジェクトを動かすために、
valet link
を使用できます。サブドメインや他のドメインをプロジェクトに追加するためには、プロジェクトフォルダからvalet link subdomain.app-name
を実行します。
TLSを使ったサイト安全化
Valetはデフォルトで通常のHTTP通信で接続します。しかし、HTTP/2を使った暗号化されたTLSで通信したい場合は、secure
コマンドを使ってください。たとえば、laravel.test
ドメインでValetによりサイトが動作している場合、以下のコマンドを実行することで安全な通信を行います。
valet secure laravel
サイトを「安全でない」状態へ戻し、通常のHTTP通信を使いたい場合は、unsecure
コマンドです。secure
コマンドと同様に、セキュアな通信を辞めたいホスト名を指定します。
valet unsecure laravel
サイトの共有
Valetはローカルサイトをモバイルでテストしたり、チームメンバーや顧客と共有したりするため、世界に公開するコマンドも用意しています。Valetがインストールしてあれば、他のソフトウェアは必要ありません。
Ngrokを使用した公開
サイトを共有するには、ターミナルでサイトのディレクトリに移動し、valet share
コマンドを実行します。公開用のURLはクリップボードにコピーされますので、ブラウザに直接ペーストしてください。これだけでブラウザで閲覧したり、チームでシェアできます。
サイトの共有を中止する場合は、Control + C
でプロセスをキャンセルしてください。
Tip!! 共有コマンドには、
valet share --region=eu
のようなオプションのパラメータを渡せます。詳しい情報は、ngrokのドキュメントをご覧ください。
ローカルネットワークでのサイト共有
Valetは内部の127.0.0.1
インターフェイスへ送信されるトラフィックをデフォルトで制限しています。これにより、開発マシンをインターネットからのセキュリティリスクに晒すのを防いでいます。
たとえば、192.168.1.10/app-name.test
のようにIPアドレスにより、あなたのマシン上のValetサイトへローカルネットワーク上の他のデバイスからのアクセスを許す必要があるとしましょう。80ポートと443ポートへ向けての127.0.0.1:
プレフィックスを削除することで、listen
ディレクティブの制限を解除するために、適切なNginx設定ファイルを編集する必要があります、
プロジェクトでvalet secure
を実行していない場合は、/usr/local/etc/nginx/valet/valet.conf
ファイルを編集し、HTTPSではないサイトへのネットワークアクセスを開けます。あるサイトに対しvalet secure
を実行することで、HTTPSにてプロジェクトサイトを動かしている場合は、~/.config/valet/Nginx/app-name.test
ファイルを編集する必要があります。
Nginx設定を更新したら、設定の変更を反映するためにvalet restart
コマンドを実行してください。
サイト限定環境変数
あるアプリケーションでは、サーバ環境変数に依存するフレームワークを使っているが、プロジェクトでそのような変数を設定する手段を提供していないことがあります。Valetでは、プロジェクトのルートに.valet-env.php
ファイルを追加することで、サイト限定の環境変数を設定できます。
<?php
// foo.testサイトのために、$_SERVER['key']へ"value"をセットする
return [
'foo' => [
'key' => 'value',
],
];
// 全サイトのために、$_SERVER['key']へ"value"をセットする
return [
'*' => [
'key' => 'value',
],
];
デフォルトサイトの提供
場合により、未知のテストドメインを訪れた場合は404
とする代わりに、デフォルト("default")サイトをValetに提供してもらいたいこともあります。これを実現するには、~/.config/valet/config.json
設定ファルでデフォルトサイトにしたいサイトへのパスをdefault
オプションとして追加します。
"default": "/Users/Sally/Sites/foo",
カスタム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ドライバを書き上げたら、フレームワークValetDriver.php
命名規則をつかい、~/.config/valet/Drivers
ディレクトリ下に設置してください。たとえば、WordPress用にカスタムValetドライバを書いたら、ファイル名はWordPressValetDriver.php
になります。
カスタムValetドライバで実装する各メソッドのサンプルコードを見ていきましょう。
serves
メソッド
serves
メソッドは、そのドライバがやって来たリクエストを処理すべき場合に、true
を返してください。それ以外の場合はfalse
を返してください。そのためには、メソッドの中で、渡された$sitePath
の内容が、動作させようとするプロジェクトタイプを含んでいるかを判定します。
では擬似サンプルとして、WordPressValetDriver
を書いてみましょう。serves
メソッドは以下のようになります。
/**
* このドライバでリクエストを処理するか決める
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return bool
*/
public function serves($sitePath, $siteName, $uri)
{
return is_dir($sitePath.'/wp-admin');
}
isStaticFile
メソッド
isStaticFile
はリクエストが画像やスタイルシートのような「静的」なファイルであるかを判定します。ファイルが静的なものであれば、そのファイルが存在するディスク上のフルパスを返します。リクエストが静的ファイルでない場合は、false
を返します。
/**
* リクエストが静的なファイルであるかを判定する
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string|false
*/
public function isStaticFile($sitePath, $siteName, $uri)
{
if (file_exists($staticFilePath = $sitePath.'/public/'.$uri)) {
return $staticFilePath;
}
return false;
}
Note:
isStaticFile
メソッドは、リクエストのURIが/
ではなく、serves
メソッドでtrue
が返された場合のみ呼びだされます。
frontControllerPath
メソッド
frontControllerPath
メソッドは、アプリケーションの「フロントコントローラ」への絶対パスを返します。通常は"index.php`ファイルか、似たようなファイルでしょう。
/**
* アプリケーションのフロントコントローラへの絶対パスの取得
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string
*/
public function frontControllerPath($sitePath, $siteName, $uri)
{
return $sitePath.'/public/index.php';
}
ローカルドライバ
一つのアプリケーションに対して、Valetのカスタムドライバを定義する場合は、アプリケーションのルートディレクトリにLocalValetDriver.php
を作成してください。カスタムドライバは、ベースのValetDriver
クラスか、LaravelValetDriver
のような、既存のアプリケーション専用のドライバを拡張します。
class LocalValetDriver extends LaravelValetDriver
{
/**
* リクエストに対し、このドライバを動作させるかを決める
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return bool
*/
public function serves($sitePath, $siteName, $uri)
{
return true;
}
/**
* アプリケーションのフロントコントローラに対する完全な解決済みパスを取得する
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string
*/
public function frontControllerPath($sitePath, $siteName, $uri)
{
return $sitePath.'/public_html/index.php';
}
}
PHP設定
インストールしたPHPをカスタマイズするための/usr/local/etc/php/7.X/conf.d/
ディレクトリへ、PHP設定の.ini
ファイルを追加できます。設定を追加、もしくは更新したらvalet restart php
を実行してください。
PHPメモリ制限
Valetは、/usr/local/etc/php/7.X/conf.d/php-memory-limits.ini
設定ファイルで最大メモリ制限とアップロードファイルの最大サイズをデフォルトとして指定しています。これはCLIとFPMのPHPプロセス両方に影響します。
PHP-FPMのPoolプロセス
ValetのPHP−FPM設定は、/usr/local/etc/php/7.X/php-fpm.d/valet-fpm.conf
設定ファイルに含まれています。このファイルでPHPアプリケーションにより使用されるFPMサーバと子プロセスの数を増やすことができます。
その他のValetコマンド
コマンド | 説明 |
---|---|
valet forget |
"park"された(サイト検索の親ディレクトリとして登録されたJ)ディレクトリでこのコマンドを実行し、サイト検索対象のディレクトリリストから外します。 |
valet log |
Valetサービスにより書き込まれたログリストの表示 |
valet paths |
"park"されたすべてのパスを表示します。 |
valet restart |
Valetデーモンをリスタートします。 |
valet start |
Valetデーモンをスタートします。 |
valet stop |
Valetデーモンを停止します。 |
valet trust |
Valetコマンド実行でパスワード入力をしなくて済むように、BrewとValetへsudoersファイルを追加します。 |
valet uninstall |
Valetをアンインストールします。手動で削除する場合のインストラクションを表示します。--force パラメータを指定した場合は、Valetすべてを強制的に削除します。 |
Valetのディレクトリとファイル
Valet環境の問題を追求/解決するときに役立つ、ディレクトリとファイルの一覧です。
ファイル/ディレクトリ | 説明 |
---|---|
~/.config/valet/ |
Valetの設定すべてが含まれます。このフォルダのバックアップを管理しておきましょう。 |
~/.config/valet/dnsmasq.d/ |
DNSMasqの設定が含まれます。 |
~/.config/valet/Drivers/ |
カスタムValetドライバが含まれます。 |
~/.config/valet/Extensions/ |
カスタムValet拡張/コマンドが含まれます。 |
~/.config/valet/Nginx/ |
Valetが生成したNginxサイト設定すべてが含まれます。生成済みファイルはinstall 、secure 、tld コマンド実行時に再生成されます。 |
~/.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 |
サイト認証を構築するのに使用されるデフォルトNginx設定です。 |