Skip to content

Laravel Valet

はじめに

Note

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

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

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

デフォルトで、Valetは以下を含むがこれに限定されないサポートを提供します:

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

インストール

Warning

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バージョン

Note

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

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

valet use php@8.2

valet use php

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

php=php@8.2

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

Warning

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

データベース

アプリケーションがデータベースを必要とする場合は、DBnginをチェックしてください。DBnginは、MySQL、PostgreSQL、Redisを含む無料のオールインワンデータベース管理ツールを提供します。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のインストールをアップグレードできます。アップグレード後、valet installコマンドを実行して、必要に応じてValetが設定ファイルに追加のアップグレードを行うようにするのが良い習慣です。

Valet 4へのアップグレード

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

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

サイトの提供

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

The park コマンド

parkコマンドは、マシン上のディレクトリを登録します。このディレクトリに含まれるすべてのディレクトリは、http://<directory-name>.testでWebブラウザからアクセスできるようになります:

cd ~/Sites

valet park

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

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コマンドを使用できます。たとえば、サイトがlaravel.testドメインでValetによって提供されている場合、次のコマンドを実行してサイトを保護する必要があります:

valet secure laravel

サイトを「非セキュア」にし、プレーンなHTTP経由でトラフィックを提供するように戻すには、unsecureコマンドを使用します。secureコマンドと同様に、このコマンドはセキュアにしたいホスト名を受け付けます:

valet unsecure laravel

デフォルトサイトの提供

未知のtestドメインにアクセスした際に404ではなく、「デフォルト」サイトを提供するようにValetを設定したい場合があります。これを実現するには、~/.config/valet/config.json設定ファイルにdefaultオプションを追加し、デフォルトサイトとして提供するサイトのパスを指定します:

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

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

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

cd ~/Sites/example-site

valet isolate php@8.0

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

valet isolate php@8.0 --site="site-name"

便宜上、valet phpvalet composervalet 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コマンドを使用してValetの設定を更新し、ngrokまたはexposeを指定します:

valet share-tool ngrok

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

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

cd ~/Sites/laravel

valet share

サイトの共有を停止するには、Control + Cを押します。

Warning

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

Ngrok経由でのサイト共有

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

valet set-ngrok-token YOUR_TOKEN_HERE

Note

valet share --region=euのように、追加のngrokパラメータをshareコマンドに渡すことができます。詳細については、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を実行していない場合、すべての非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 [
    // Set $_SERVER['key'] to "value" for the laravel.test site...
    'laravel' => [
        'key' => 'value',
    ],

    // Set $_SERVER['key'] to "value" for all sites...
    '*' => [
        'key' => 'value',
    ],
];

サービスのプロキシ

ValetとDockerが同時にポート80をバインドできないため、Valetを実行しながらDockerで別のサイトを実行する必要がある場合があります。これを解決するには、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「ドライバ」を作成して、ValetにネイティブでサポートされていないフレームワークやCMSで実行されているPHPアプリケーションを提供することができます。Valetをインストールすると、~/.config/valet/Driversディレクトリが作成され、その中にSampleValetDriver.phpファイルが含まれます。このファイルには、カスタムドライバの実装方法を示すサンプルドライバの実装が含まれています。ドライバを作成するには、servesisStaticFilefrontControllerPathの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メソッドは次のようになります:

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

isStaticFileメソッド

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

/**
 * Determine if the incoming request is for a static file.
 *
 * @return string|false
 */
public function isStaticFile(string $sitePath, string $siteName, string $uri)
{
    if (file_exists($staticFilePath = $sitePath.'/public/'.$uri)) {
        return $staticFilePath;
    }

    return false;
}

Warning

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

frontControllerPathメソッド

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

/**
 * Get the fully resolved path to the application's front controller.
 */
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コマンド

コマンド 説明
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に許可するようプロンプトを表示します。または、手動でシステム環境設定 > セキュリティとプライバシー > プライバシーからフルディスクアクセスを選択し、メインウィンドウペインでnginxのエントリを有効にすることもできます。

ユーザーノート