この記事について
-
この記事は、Laravel 8 のGetting Startedを和訳したものです。
-
公式のチュートリアルなので、安心して、かつ効率的に学習することができます。
-
Laravelのインストールとその設定、各種ツールの説明まで網羅されているので、初学者がLaravel 8 に初めて触れたり、中級者が基礎を振り返るのに最適です。
-
読者に誤解を与えない部分は、読みやすさを重視して適宜意訳しています。
-
英語の記事へのリンクを日本語の記事へのリンクに変更したり、新しくリンクを追加している部分があります。
-
DeepL等を使用して推敲は行っていますが、間違っているところやより良い表現があれば、どんどん編集リクエストをお願いいたします。
-
文頭にある
は、原文のリンクになっています。
翻訳元
laravel / docs : https://github.com/laravel/docs/tree/8.x
ライセンス : MIT
インストール
サーバに必要なもの
Laravelを使用するためには、いくつか必要なものがあります。Laravel Homesteadという仮想マシンを使用すれば必要なものは全て揃うので、Homesteadを使用してLaravelのローカル開発環境を構築することを強くおすすめします。
Homesteadを使用しない場合、サーバは以下の条件を満たす必要があります。
- PHP >= 7.3
- BCMath PHP拡張
- Ctype PHP拡張
- Fileinfo PHP拡張
- JSON PHP拡張
- Mbstring PHP拡張
- OpenSSL PHP拡張
- PDO PHP拡張
- Tokenizer PHP拡張
- XML PHP拡張
Laravelをインストールする
Laravelは、依存関係の管理にComposerを利用しています。なので、Laravelをインストールする前に、Composerがインストールされていることを確かめてください。
和訳者メモ
Macをご利用の場合は、HomeBrewでインストールできます。
brew install composer
Laravelインストーラを使用する方法
まず、Composerを使用して、Laravelインストーラをダウンロードします。
composer global require laravel/installer
Laravelの実行ファイルにパスを通すために、Composerのvendor binディレクトリが$PATHに含まれていることを確認してください。vendor binディレクトリのある場所は、OSによって異なりますが、多くの場合は以下の場所に配置されています。
-
macOS:
$HOME/.composer/vendor/bin -
Windows:
%USERPROFILE%\AppData\Roaming\Composer\vendor\bin -
GNU / Linuxディストリビューション:
$HOME/.config/composer/vendor/binもしくは、$HOME/.composer/vendor/bin
Composerのグローバルインストールのパスは、composer global aboutを実行して確認できます。
インストールが終わったら、laravel newコマンドを実行して、指定したディレクトリに新しいLaravelプロジェクトを作成できます。例えば、laravel new blogコマンドは、blogという名前のディレクトリを作成し、その中にLaravelの依存関係がすでにインストールされた状態のプロジェクトを配置します。
laravel new blog
ヒント
ログインや登録などの機能を備えたLaravelプロジェクトを作りたいなら、Laravel Jetstreamをチェックしてみてください。
Composer Create-Projectを使用する方法
Laravelインストーラを使用する代わりに、Composerのcreate-projectコマンドでも、Laravelをインストールできます。
composer create-project --prefer-dist laravel/laravel blog
開発用ローカルサーバ
PHPがすでにローカルにインストールされていて、PHPに組み込まれている開発用サーバでアプリケーションを公開したい場合、Artisanのserveコマンドを使用してください。このコマンドを実行すると、http://localhost:8000で開発用サーバが起動します。
php artisan serve
ローカル開発環境を強化したい場合は、HomesteadとValetを利用してください。
設定
公開ディレクトリ
Laravelをインストールすると、WebサーバのドキュメントとWebルートがpublicディレクトリに設定されます。publicディレクトリにあるindex.phpは、アプリケーションへ入る全てのHTTPリクエストのフロントコントローラとして機能します。
設定ファイル
Laravelの設定ファイルは、全てconfigディレクトリに保存されています。それぞれのオプションはドキュメント化されているので、目を通しておいてください。
ディレクトリのパーミッション
Laravelをインストールしたら、いくつかパーミッションの設定が必要です。storage内のディレクトリとbootstrap/cacheディレクトリは、Webサーバによって書き込みができる必要があり、そうでなければLaravelは起動できません。Homesteadを使用している場合、これらのパーミッションはすでに設定されています。
アプリケーションキー
Laravelをインストールした後にしておかなければならないのが、アプリケーションキーにランダムな文字列を設定することです。ComposerかLaravelインストーラを使ってLaravelをインストールした場合は、このキーは既にphp artisan key:generateコマンドによって設定されています。
通常、この文字列は32文字の必要があります。また、キーは.envという環境ファイルで設定できます。.env.exampleファイルを.envという名前でコピーしていない場合は、コピーしてください。アプリケーションキーがセットされていない場合、ユーザーセッションやその他の暗号化されたデータは安全ではありません。
追加設定
Laravelはこれ以上設定を必要とせず、すぐに使い始められます。ただし、config/app.phpファイルとそのドキュメントには目を通しておいてください。このファイルには、timezoneやlocaleのような、アプリケーションに応じて変更するべきオプションがいくつか含まれています。
以下のような追加コンポーネントを構成することもできます。
Webサーバ設定
ディレクトリ設定
Laravelは、常にWebサーバに構成された「Webディレクトリ」のルートから配信される必要があります。Laravelアプリケーションを「Webディレクトリ」のサブディレクトリから配信しないでください。アプリケーション内の機密ファイルを公開してしまう恐れがあります。
URLの設定
Apache
Laravelにはpublic/.htaccessファイルが含まれており、これがあることで、パスにフロントコントローラであるindex.phpを含まないURLを提供できます。ApacheでLaravelを配信する前に、必ずmod_rewriteモジュールを有効化して、サーバが.htaccessファイルを使用するように設定してください。
Laravelに含まれる.htaccessがApache上でうまく動作しない場合は、以下の代替案を試してみてください。
Options +FollowSymLinks -Indexes
RewriteEngine On
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Nginx
Nginxを使用している場合は、サイト設定に以下のディレクティブを記述して、全てのリクエストがフロントコントローラであるindex.phpに流れるようにしてください。
location / {
try_files $uri $uri/ /index.php?$query_string;
}
HomesteadかValetを使用している場合、URLの設定は自動で行われます。
設定
はじめに
Laravelの設定ファイルは、全てconfigディレクトリに保存されています。それぞれのオプションはドキュメント化されているので、目を通しておいてください。
環境設定
アプリケーションが実行されている環境ごとに、別々の設定値を使用すると、便利なことがよくあります。例えば、本番環境と異なるキャッシュドライバをローカルで使用する場合などです。
これを簡単にできるようにするため、Laravelでは、PHPライブラリのDotEnvを利用しています。新しく作成したLaravelプロジェクトには、アプリケーションのルートディレクトリに.env.exampleファイルがあります。ComposerでLaravelをインストールした場合、このファイルは自動的に.envとしてコピーされます。それ以外の場合では、自分でファイルをコピーする必要があります。
.envファイルをアプリケーションのソース管理リポジトリにコミットするべきではありません。なぜかというと、アプリケーションを使用する開発者やサーバによって、必要とする環境設定は異なるからです。もっというと、機密情報が公開されるので、悪意のある侵入者がソース管理リポジトリにアクセスした場合、セキュリティリスクになります。
チームで開発している場合、.env.exampleファイルはアプリケーションに残しておいたほうがいいかもしれません。サンプルの設定ファイルにプレースホルダの値を入れておくことで、チーム内の他の開発者が、どの環境変数がアプリケーションの実行に必要なのかよく分かるからです。また、.env.testingファイルを作成することもできます。このファイルは、PHPUnitのテストを実行したり、--env=testingオプションを付けてArtisanコマンドを実行した場合に、.envファイルをオーバーライドします。
.envファイル内の任意の変数は、サーバレベルやシステムレベルの外部にある環境変数でオーバーライドすることができます。
環境変数の種類
.envファイル内の変数は全て文字列としてパースされるので、env()関数によっていろいろな型を返せるように、いくつか予約語が用意されています。
.env の値 |
env() の値 |
|---|---|
| true | (bool) true |
| (true) | (bool) true |
| false | (bool) false |
| (false) | (bool) false |
| empty | (string) '' |
| (empty) | (string) '' |
| null | (null) null |
| (null) | (null) null |
スペースが含まれた値を環境変数として定義したい場合は、値をダブルクォーテーションで囲ってください。
APP_NAME="My Application"
環境変数の取得
このファイルに記載された全ての変数は、アプリケーションがリクエストを受け取ったときに、PHPのスーパーグローバル変数である$_ENVに読み込まれます。ただし、設定ファイル内の変数を取得するには、envというヘルパー関数を使用します。実際にLaravelの設定ファイルを見てみると、いくつかのオプションでこのヘルパー関数が使用されているのが分かります。
'debug' => env('APP_DEBUG', false),
env関数に渡されている第二引数はデフォルト値です。与えられたキーに対応する環境変数が存在しなかった場合、この値が使用されます。
現在の環境を把握する
アプリケーションの現在の環境は、.envファイルのAPP_ENV変数で決定されます。この値にアクセスするには、Appファサードのenvironmentメソッドを使用します。
$environment = App::environment();
また、現在の環境が指定された値であるかどうかを確かめるために、environmentメソッドに引数を渡すこともできます。現在の環境が指定された値のいずれかに当てはまる場合、このメソッドはtrueを返します。
if (App::environment('local')) {
// 環境がlocalである
}
if (App::environment(['local', 'staging'])) {
// 環境がlocalかstagingのいずれかである
}
アプリケーションの環境は、サーバレベルの環境変数
APP_ENVで上書きできます。これを応用すると、別々の環境でアプリケーションを共有できます。
デバッグページから環境変数を秘匿する
例外がキャッチされず、かつ環境変数APP_DEBUGがtrueの場合、デバッグページに全ての環境変数とその内容が表示されます。設定ファイルconfig/app.php内のdebug_hideオプションを使用すると、特定の変数を隠すことができます。
いくつかの変数は、環境変数とサーバ/リクエストデータの両方で使用されます。そのため、$_ENVと$_SERVERの両方に指定しなければいけない場合もあります。
return [
// ...
'debug_hide' => [
'_ENV' => [
'APP_KEY',
'DB_PASSWORD',
],
'_SERVER' => [
'APP_KEY',
'DB_PASSWORD',
],
'_POST' => [
'password',
],
],
];
設定値へのアクセス
グローバルヘルパー関数のconfigを使用することで、アプリケーションのどこからでも設定値にアクセスすることができます。設定値にアクセスするには、アクセスしたいファイル名とオプション名を含んだドット記法を使用します。デフォルト値を指定することもでき、設定オプションが存在しなかった場合に返される値を指定できます。
$value = config('app.timezone');
// 設定値が存在しない場合、デフォルト値が使用される
$value = config('app.timezone', 'Asia/Seoul');
実行時に設定値をセットする場合、ヘルパー関数configに配列を渡します。
config(['app.timezone' => 'America/Chicago']);
和訳者メモ
3通りの方法で環境の値が取得できるということになります。
>>> config('app.env') => "local" >>> App::environment() => "local" >>> env('APP_ENV') => "local"
設定のキャッシュ
アプリケーションの速度を上げるためには、Artisanコマンドのconfig:cacheを使用して、全ての設定ファイルを一つのファイルにキャッシュする必要があります。これにより、アプリケーションの全ての設定オプションは一つのファイルにまとめられ、フレームワークが素早く読み込めるようになります。
通常、本番環境へのデプロイのルーティンとしてphp artisan config:cacheコマンドは実行するべきです。アプリケーションの開発中は、頻繁に設定オプションを変更するので、このコマンドを実行するべきではありません。
注意
デプロイ処理中に
config:cacheコマンドを実行する場合、設定ファイル内からのみenv関数が呼び出されていることを確認してください。設定がキャッシュされると、.envファイルは読み込まれず、env関数はnullを返すようになります。
メンテナンスモード
アプリケーションをメンテナンスモードにすると、アプリケーションへの全てのリクエストに対して、カスタムビューが表示されます。これによって、アップデート中やメンテナンス中にアプリケーションを簡単に「無効化」させることができます。メンテナンスモードのチェックは、アプリケーションの標準ミドルウェア内で行われています。アプリケーションがメンテナンスモードになると、ステータスコード503のMaintenanceModeExceptionが投げられます。
メンテナンスモードを有効にするには、Artisanコマンドのdownを実行してください。
php artisan down
また、downコマンドにretryオプションを与えると、HTTPヘッダにRetry-Afterの値としてセットされます。
php artisan down --retry=60
メンテナンスモードの迂回
メンテナンスモード中でも、secretオプションを使用して、メンテナンスモードを迂回するためのトークンを指定することができます。
php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"
アプリケーションをメンテナンスモードにした後、このトークンを指定したアプリケーションのURLを開くと、Laravelはブラウザにメンテナンスモードを迂回するためのCookieを発行します。
https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515
この隠されたルートにアクセスすると、アプリケーションのルート/にリダイレクトされます。一度ブラウザにCookieが発行されると、メンテナンスモードが無効のときと同じように、アプリケーションをブラウズできます。
メンテナンス画面のプリレンダリング
デプロイ時にphp artisan downコマンドを利用した場合、Composerの依存関係やその他のインフラコンポーネントが更新されている間、ユーザがアプリケーションにアクセスするとエラーが発生する場合があります。なぜそんなことが起こるかというと、アプリケーションがメンテナンスモードであることを判定し、テンプレートエンジンを使用してメンテナンス画面を描画するためには、Laravelの大部分を起動する必要があるからです。
そのため、リクエストサイクルの最初に返されるメンテナンスモード画面を事前にレンダリングできます。この画面は、アプリケーションの依存関係が読み込まれる前にレンダリングされます。プリレンダリングには、downコマンドのrenderオプションで指定したテンプレートが使用されます。
php artisan down --render="errors::503"
メンテナンスモードへのリクエストをリダイレクトする
メンテナンスモードの間、ユーザがアクセスを試みた全てのアプリケーションURLにメンテナンス画面が表示されます。必要に応じて、全てのリクエストを指定したURLにリダイレクトできます。これには、redirectオプションを使用します。全てのリクエストを/というURIにリダイレクトさせる例は以下の通りです。
php artisan down --redirect=/
メンテナンスモードを終了する
メンテナンスモードを終了するには、upコマンドを使用します。
php artisan up
ヒント
メンテナンスモードのテンプレートは、
resources/views/errors/503.blade.phpに独自のテンプレートを定義することでカスタマイズできます。
メンテナンスモードとキュー
アプリケーションがメンテナンスモードの間、キュージョブは処理されません。アプリケーションがメンテナンスモードから抜けると、ジョブは通常どおり処理されます。
メンテナンスモードの代替案
メンテナンスモードを使用すると、アプリケーションに数秒のダウンタイムが発生するので、Laravelでダウンタイムの無いデプロイを実現したい場合は、Envoyerのような代替案を検討してください。
ディレクトリ構造
はじめに
デフォルトのLaravelのアプリケーション構造は、大規模なアプリケーションから小規模なアプリケーションまで、優れたスタートポイントを提供することを目的としています。しかし、アプリケーションを好きなように構成することもできます。Laravelは、Composerがクラスをオートロードできる限り、クラスの配置にほとんど制限を設けていません。
ルートディレクトリ
appディレクトリ
appディレクトリには、アプリケーションのコアとなるコードが含まれています。このディレクトリに関しては後でもう少し掘り下げて説明しますが、アプリケーションのクラスのほとんどは、このディレクトリの中にあります。
bootstrapディレクトリ
bootstrapディレクトリには、フレームワークを起動するapp.phpファイルが含まれています。また、cacheディレクトリも含まれており、パフォーマンスの最適化のためにフレームワークが生成したrouteやservicesのキャッシュファイルなどが含まれています。
configディレクトリ
configディレクトリには、アプリケーションの設定ファイルが全て含まれています。全てのファイルに目を通し、利用可能なオプションを理解することをおすすめします。
databaseディレクトリ
databaseディレクトリには、データベースのマイグレーション、モデルファクトリー、シードが含まれています。必要に応じて、このディレクトリにSQLiteデータベースを保持することもできます。
publicディレクトリ
publicディレクトリには、index.phpファイルが含まれています。このindex.phpファイルは、アプリケーションへの全てのリクエストのエントリーポイントであり、オートロードの構成も行います。また、このディレクトリには、画像、JavaScript、CSSなどのアセットも入っています。
resourcesディレクトリ
resourcesディレクトリには、ビューだけでなく、LESS、SASS、JavaScriptのような、コンパイル前の生のアセットが含まれます。また、このディレクトリには、全ての言語ファイルも入っています。
routesディレクトリ
routesディレクトリには、アプリケーションのルート定義が含まれています。デフォルトでは、web.php、api.php、console.php、channels.phpというルートファイルが入っています。
web.phpファイルには、RouteServiceProviderがwebというミドルウェアのグループに配置するルートが含まれており、セッションの状態、CSRFの保護、Cookieの暗号化を提供します。アプリケーションがステートレスなRESTful APIを提供しない場合、ルートは全てweb.phpファイルで定義される可能性が高いです。
api.phpファイルには、RouteServiceProviderがapiというミドルウェアのグループに配置するルートが含まれており、レートリミットを提供します。このファイル内で定義されるルートはステートレスであることを意図しているので、これらのルートを経由してアプリケーションへと入るリクエストはトークンで認証され、セッションの状態(ステート)にアクセスすることはありません。
console.phpファイルには、クロージャベースのコンソールコマンドを定義できます。各クロージャは、コマンドインスタンスにバインドされており、各コマンドのIOメソッドと相互に通信することを可能にします。このファイルには、HTTPのルートではなく、アプリケーションへのコンソールベースのエントリーポイント(ルート)が定義されています。
channels.phpファイルには、アプリケーションがサポートしている全てのイベントブロードキャストチャネルを登録できます。
和訳者メモ
console.phpでinspireが定義されているので、以下のコマンドを実行すると、英語の格言が表示されます。php artisan inspire
![]()
storageディレクトリ
storageディレクトリには、コンパイルされたBladeテンプレート、ファイルベースのセッション、ファイルキャッシュなど、フレームワークによって生成されたファイルが含まれています。このディレクトリは、app、framework、logsディレクトリに分けられています。appディレクトリには、アプリケーションが生成したファイルが保存されます。frameworkディレクトリには、フレームワークが生成したファイルと、キャッシュが保存されます。最後に、logsディレクトリには、アプリケーションのログファイルが格納されます。
storage/app/publicディレクトリは、プロフィールアバターのような、一般に公開される必要がある、ユーザが生成したファイルを保存する場所です。このディレクトリを指すシンボリックリンクをpublic/storageに作成してください。このリンクは、php artisan storage:linkコマンドを使用して作成できます。
testsディレクトリ
testsディレクトリには、自動化されたテストが含まれています。Laravelプロジェクトを作成すると、最初からPHPUnitテストの例が用意されています。それぞれのテストクラスには、Testという接尾語が付けられている必要があります。テストを実行するには、phpunitコマンドか php vendor/bin/phpunitコマンドを使用します。
vendorディレクトリ
vendorディレクトリには、Composerの依存関係が含まれています。
Appディレクトリ
アプリケーションの大部分は、appディレクトリに格納されます。このディレクトリは、デフォルトでApp下に名前空間があり、PSR-4標準オートロードを使用してComposerにオートロードされます。
appディレクトリには、ConsoleやHttps、Providersなどの様々な追加ディレクトリが含まれています。ConsoleとHttpディレクトリは、アプリケーションのコアにAPIを提供しているものと考えてください。HTTPプロトコルとCLIは、どちらもアプリケーションと通信するための仕組みですが、アプリケーションのロジックを一切含みません。言い換えると、これらはアプリケーションにコマンドを発行する2通りの方法です。Consoleディレクトリには、全てのArtisanコマンドが格納され、一方のHttpディレクトリには、コントローラ、ミドルウェア、およびリクエストが格納されます。
Artisanコマンドのmakeを使用してクラスを生成すると、appディレクトリ内に様々なディレクトリが生成されます。そのため、例えばArtisanコマンドのmake:jobを実行してjobクラスを生成するまで、app/Jobsというディレクトリは存在しません。
ヒント
appディレクトリ内のクラスの多くは、コマンドを介してArtisanによって生成することができます。利用可能なコマンドを確認するには、ターミナルでphp artisan list makeを実行してください。
Broadcastingディレクトリ
Broadcastingディレクトリには、アプリケーションの全てのブロードキャストチャネルクラスが含まれています。これらのクラスは、make:channelコマンドを使用して生成できます。このディレクトリはデフォルトでは存在しませんが、最初にチャネルを作成したときに作成されます。チャネルについての詳細は、ブロードキャスティングのドキュメントを参照してください。
Consoleディレクトリ
Consoleディレクトリには、アプリケーションの全てのカスタムArtisanコマンドが含まれています。これらのコマンドは、make:commandコマンドを使用して生成できます。また、このディレクトリには、カスタムArtisanコマンドをスケジューリングタスクに設定できるコンソールカーネルも入っています。
Eventsディレクトリ
このディレクトリはデフォルトでは存在しませんが、Artisanコマンドのevent:generate と make:eventによって作成されます。Eventsディレクトリには、イベントクラスが格納されます。イベントは、与えられたアクションが発生したことをアプリケーションの他の部分を通知するのに使用され、非常に大きな柔軟性と分離性を提供します。
Exceptionディレクトリ
Exceptionsディレクトリには、アプリケーションの例外ハンドラが含まれ、アプリケーションによって投げられた例外を配置するのに適しています。例外をログに記録したり描画する方法を変更する場合は、このディレクトリ内のHandlerクラスを編集してください。
Httpディレクトリ
Httpディレクトリには、コントローラ、ミドルウェア、フォームリクエストが含まれています。アプリケーションに入るリクエストを処理するほとんどのロジックは、このディレクトリ内にあります。
Jobsディレクトリ
このディレクトリはデフォルトでは存在しませんが、Artisanコマンドのmake:jobを実行すると作成されます。Jobsディレクトリには、アプリケーションのためのキュージョブが格納されます。ジョブは、アプリケーションによってキューに入れられるか、現在のリクエストのライフサイクルと同期して実行されます。現在のリクエストに同期して実行されるジョブについては、コマンドパターンの実装であるため、「コマンド」と呼ばれることもあります。
Listenersディレクトリ
このディレクトリはデフォルトでは存在しませんが、Artisanコマンドのevent:generateかmake:listenerを実行すると作成されます。Listenersディレクトリには、イベントを処理するクラスが含まれています。イベントリスナはイベントのインスタンスを受け取り、発生したイベントに応じてロジックを実行します。例えば、UserRegisteredイベントは、SendWelcomeEmailリスナによって処理される、という感じです。
Mailディレクトリ
このディレクトリはデフォルトでは存在しませんが、Artisanコマンドのmake:mailを実行すると作成されます。Mailディレクトリには、アプリケーションから送信されるメールを表すクラスが全て含まれています。Mailオブジェクトを使用することで、メールを構築する全てのロジックを1つのシンプルなクラスでカプセル化することができ、Mail::sendメソッドを用いて送信することができます。
Modelsディレクトリ
Modelsディレクトリには、全てのEloquentモデルクラスが含まれています。Laravelに入っているEloquent ORMは、データベースを操作するための美しくシンプルなActiveRecord実装を提供します。各データベーステーブルは対応する「モデル」があり、そのテーブルを操作するために使用できます。モデルを使用すると、テーブルのデータに対してクエリを発行したり、テーブルに新たなレコードを挿入したりできます。
Notificationsディレクトリ
このディレクトリはデフォルトでは存在しませんが、Artisanコマンドのmake:notificationを実行すると作成されます。Notificationsディレクトリには、アプリケーション内で発生したイベントに関する通知など、アプリケーションから送信される「トランザクション」の通知が全て含まれています。Laravelの通知機能を使用することで、様々なドライバを介して、メールやSlack、SMSで通知を送信したり、データベースに保存したりすることを抽象化できます。
Policiesディレクトリ
このディレクトリはデフォルトでは存在しませんが、Artisanコマンドのmake:policyを実行すると作成されます。Policiesディレクトリには、アプリケーションの認可ポリシークラスが含まれています。ポリシーは、ユーザがリソースに対して特定のアクションを実行できるかどうかを判断するのに使用されます。詳細については、認可についてのドキュメントを参照してください。
Providersディレクトリ
Providersディレクトリには、アプリケーションの全てのサービスプロバイダが含まれています。サービスプロバイダは、サービスコンテナ内のサービスをバインドしたり、イベントを登録したり、リクエストに対してアプリケーションを準備するために他のタスクを実行したりすることで、アプリケーションを起動します。
新規作成したLaravelアプリケーションの場合、このディレクトリにはすでにいくつかプロバイダが入っています。必要に応じて、独自のプロバイダをこのディレクトリに追加することができます。
Rulesディレクトリ
このディレクトリはデフォルトでは存在しませんが、Artisanコマンドのmake:ruleを実行することで作成されます。Rulesディレクトリには、アプリケーションのカスタムバリデーションルールオブジェクトが含まれます。ルールは、複雑なバリデーションロジックをシンプルなオブジェクトへカプセル化するために使用されます。詳細については、バリデーションについてのドキュメントを参照してください。
Homestead
はじめに
Laravelは、ローカルでの開発を含めたPHP開発体験全体をより楽しくすることに努めてきました。Vagrantを使えば、仮想マシンの管理とプロビジョニングをシンプルかつ洗練された方法で行えます。
Laravel Homesteadは、ローカルマシンにPHPやWebサーバなどのサーバソフトウェアを必要とせず、素晴らしい開発環境を提供してくれる、パッケージがインストールされた状態の公式Vagrant Boxです。これを使えば、もうOSが散らかる心配はありません。Vagrant Boxは使い捨てです。何か問題が起きても、数分でBoxを破棄して作り直すことができます。
Homesteadは、Windows / Mac / Linux上で動作し、Nginx / PHP / MySQL / PostgresSQL / Redis / Memcached / Nodeなど、Laravelアプリケーションを開発するのに必要なものが全て含まれています。
注意
Windowsを使用している場合、ハードウェアの仮想化 (VT-x) を有効にする必要があります。これは通常、BIOSで有効化できます。
UEFIシステムでHyper-Vを使用している場合、VT-xにアクセスするためにHyper-Vを無効化する必要があります。
####含まれているソフトウェア
- Ubuntu 18.04
- Git
- PHP 7.4
- PHP 7.3
- PHP 7.2
- PHP 7.1
- PHP 7.0
- PHP 5.6
- Nginx
- MySQL
- lmm for MySQL or MariaDB database snapshots
- Sqlite3
- PostgreSQL (9.6, 10, 11, 12)
- Composer
- Node (With Yarn, Bower, Grunt, and Gulp)
- Redis
- Memcached
- Beanstalkd
- Mailhog
- avahi
- ngrok
- Xdebug
- XHProf / Tideways / XHGui
- wp-cli
オプションのソフトウェア
- Apache
- Blackfire
- Cassandra
- Chronograf
- CouchDB
- Crystal & Lucky Framework
- Docker
- Elasticsearch
- Gearman
- Go
- Grafana
- InfluxDB
- MariaDB
- MinIO
- MongoDB
- MySQL 8
- Neo4j
- Oh My Zsh
- Open Resty
- PM2
- Python
- RabbitMQ
- Solr
- Webdriver & Laravel Dusk Utilities
インストール&セットアップ
最初にすること
Homestead環境を立ち上げる前に、Vagrantと合わせて、VirtualBox 6.x、VMWare、Parallelsまたは、Hyper-Vをインストールする必要があります。これらのソフトウェアパッケージは、一般的なOSに対応した使いやすいビジュアルインストーラです。
VMwareプロバイダを使用する場合、VMware Fusion / WorkstationとVMware Vagrantプラグインを購入する必要があります。無料ではありませんが、VMwareを使用すると、共有フォルダのパフォーマンスを高速化することができます。
Parallelsプロバイダを使用する場合、Parallels Vagrantプラグインをインストールする必要があります。これは無料です。
Vagrantには制限があるので、Hyper-Vプロバイダは全てのネットワーク設定を無視します。
和訳者メモ
VagrantをHomebrewでインストールするには、以下のコマンドを実行します。
brew cask install vagrantParallels Vagrantプラグインの概要とインストール方法については以下の日本語記事を参考にしてください。
Homestead Vagrant Boxのインストール
VirtualBox / VMwareとVagrantをインストールしたら、ターミナルで以下のコマンドを実行して、laravel/homestead BoxをVagrantに追加する必要があります。インターネットの通信スピードによりますが、Boxのダウンロードには数分かかります。
vagrant box add laravel/homestead
コマンドの実行に失敗した場合、Vagrantが最新であるか確認してみてください。
注意
Homesteadは、テストのために"alpha" / "beta" Boxを定期的に発行しますが、それが
vagrant box addコマンドに支障をきたす場合があります。vagrant box addの実行で問題が発生した場合は、vagrant upコマンドを実行することで、Vagrantが仮想マシンの起動をしようとしたときに、正しいBoxをダウンロードすることができます。
Homesteadのインストール
ホストマシンにレポジトリをクローンして、Homesteadをインストールしてください。Homestead Boxは、全てのLaravelプロジェクトのホストとして機能するため、ホームディレクトリのHomesteadフォルダ内にレポジトリをクローンすることをおすすめします。
git clone https://github.com/laravel/homestead.git ~/Homestead
masterブランチがいつも安定版というわけではないので、タグ付けされたバージョンのHomesteadを確認してください。最新の安定版は、GitHubのリリースページで確認できます。
代わりに、常に最新の安定版がリリースされているreleaseブランチにチェックアウトするという方法もあります。
cd ~/Homestead
git checkout release
Homesteadリポジトリをクローンしたら、Homesteadディレクトリでbash init.shコマンドを実行し、Homestead.yamlという設定ファイルを生成してください。Homestead.yamlファイルは、Homesteadディレクトリに配置されます。
// Mac / Linuxの場合
bash init.sh
// Windowsの場合
init.bat
Homesteadの設定
プロバイダを起動する
Homestead.yamlファイルのproviderキーには、どのVagrantプロバイダを使用するかを指定します( virtualbox, vmware_fusion, vmware_workstation, parallels もしくはhypervのいずれか)。任意のプロバイダを設定してください。
provider: virtualbox
共有フォルダの設定
Homestead.yamlファイルのfoldersプロパティには、Homestead環境と共有したいフォルダを列挙します。これらのフォルダに含まれるファイルが変更されると、ローカルマシンとHomestead環境の間で同期されます。共有フォルダは、必要な数だけ設定できます。
folders:
- map: ~/code/project1
to: /home/vagrant/project1
Windowsをご利用の方は、
~/のようなパスの書き方はせず、代わりにC:\Users\user\Code\project1のようなプロジェクトへのフルパスを使用してください。
全てを~/codeフォルダにマッピングするのではなく、個々のプロジェクトは独自のフォルダにマッピングするようにしてください。フォルダをマッピングしたとき、仮想マシンはフォルダ内の全てのファイルの全てのディスクIOを追跡します。すると、フォルダ内に多数のファイルがあるとき、パフォーマンスに影響を与えます。
folders:
- map: ~/code/project1
to: /home/vagrant/project1
- map: ~/code/project2
to: /home/vagrant/project2
注意
Homesteadを使用して
.(カレントディレクトリ)をマウントするのは絶対にやめてください。Vagrantがカレントディレクトリを/vagrantにマッピングせず、オプションの機能が壊れたり、プロビジョニング中に予期せぬ事態が起きることがあります。
NFSを有効化するには、同期フォルダの設定にフラグを追加してください。
folders:
- map: ~/code/project1
to: /home/vagrant/project1
type: "nfs"
WindowsでNFSを使用する場合は、vagrant-winnfsdプラグインのインストールを検討してください。このプラグインを使用すると、Homestead Box内のファイルとディレクトリに適切なユーザ/グループ権限を与えることができます。
また、optionsキーに列挙することで、VagrantのSynced Foldersがサポートするオプションを渡すこともできます。
folders:
- map: ~/code/project1
to: /home/vagrant/project1
type: "rsync"
options:
rsync__args: ["--verbose", "--archive", "--delete", "-zz"]
rsync__exclude: ["node_modules"]
Nginxサイトの設定
Nginxについて詳しく知らなくても問題ありません。sitesプロパティを使えば、簡単に「ドメイン」とHomestead環境のフォルダをマッピングできます。サイト設定の例は、Homestead.yamlファイルに含まれています。これにおいても、必要なだけサイトをHomesteadに追加することができます。Homesteadは、作業を行う全てのLaravelプロジェクトに、便利で視認性の高い環境を提供します。
sites:
- map: homestead.test
to: /home/vagrant/project1/public
Homestead Boxをプロビジョニングした後にsitesプロパティを変更した場合、仮想マシン上のNginx設定を更新するために、もう一度vagrant reload --provisionコマンドを実行する必要があります。
Homesteadのスクリプトは、可能な限り問題が発生しないように設計されています。それでもプロビジョニング中に問題が発生した場合は、
vagrant destroy && vagrant upコマンドを使用して、マシンの破棄と再構築を行ってください。
サービスの有効化 / 無効化
Homesteadはデフォルトでいくつかサービスを起動します。しかし、プロビジョニングの間、どのサービスを有効化し、どのサービスを無効化するのかをカスタマイズすることができます。以下の例では、PostgresSQLを有効化し、MySQLを無効化しています。
services:
- enabled:
- "postgresql@12-main"
- disabled:
- "mysql"
指定したサービスは、enabledとdisabledディレクティブに基づいて、起動または停止が行われます。
ホスト名の解決
Homesteadは、自動的にホスト名を解決できるように、mDNSを使用してホスト名を公開します。Homestead.yamlにhostname: homesteadをセットすると、homestead.localでホストを利用できるようになります。macOS、iOS、Linuxデスクトップディストリビューションは、mDNSをデフォルトでサポートしていますが、Windowsの場合は、Bonjour Print Services for Windowsのインストールが必要になります。
自動で解決されるホスト名が便利なのは、Homesteadをプロジェクトごとにインストールした場合です。一つのHomesteadインスタンス上で複数のサイトをホスティングした場合、Webサイトの「ドメイン」をマシンのhostsファイルに追加する必要があります。hostsファイルは、HomesteadサイトへのリクエストをHomesteadマシンへリダイレクトします。MacとLinuxでは、このファイルは/etc/hostsに配置され、Windowsでは、C:\Windows\System32\drivers\etc\hostsに配置されます。このファイルには、以下のような行を追加します。
192.168.10.10 homestead.test
Homestead.yamlファイルで設定されているものと同じIPアドレスを書き込む必要があります。hostsファイルにドメインを追加して、Vagrant Boxを起動したら、ウェブブラウザを介してサイトにアクセスできるようになります。
http://homestead.test
Vagrant Boxの起動
Homestead.yamlを好きなように編集したら、Homesteadディレクトリでvagrant upコマンドを実行します。すると、Vagrantは仮想マシンを起動し、共有フォルダとNginxサイトを自動的に構成します。
仮想マシンを破棄するには、vagrant destroy --forceコマンドを使用します。
プロジェクト単位のインストール
Homesteadをグローバルにインストールし、同じHomestead Boxを全てのプロジェクトで共有するのではなく、管理しているプロジェクトごとにHomesteadインスタンスを構成できます。プロジェクト単位でHomesteadをインストールすると、Vagrantfileをプロジェクトに同梱して、別の人がそのプロジェクト上でvagrant upできるようになります。
プロジェクトに直接Homesteadをインストールするには、Composerを使用する必要があります。
composer require laravel/homestead --dev
Homesteadをインストールしたら、makeコマンドでVagrantfileとHomestead.yamlファイルをプロジェクトルートに作成してください。makeコマンドは、Homestead.yamlファイル内のsitesとfoldersディレクティブを自動で設定します。
Mac / Linux :
php vendor/bin/homestead make
Windows :
vendor\\bin\\homestead make
次に、ターミナルでvagrant upコマンドを実行してから、ブラウザでhttp://homestead.testを開いてプロジェクトにアクセスしてください。覚えておいていただきたいのは、自動的なホスト名の解決を使用していない場合、homestead.testまたは任意のドメインを/etc/hostsファイルに追加する必要があります。
オプション機能のインストール
オプションのソフトウェアは、Homesteadの設定ファイルの「feature」設定を用いてインストールされます。ほとんどの機能は、論理値で有効か無効かを設定しますが、一部の機能では、複数の設定オプションが利用できます。
features:
- blackfire:
server_id: "server_id"
server_token: "server_value"
client_id: "client_id"
client_token: "client_value"
- cassandra: true
- chronograf: true
- couchdb: true
- crystal: true
- docker: true
- elasticsearch:
version: 7.9.0
- gearman: true
- golang: true
- grafana: true
- influxdb: true
- mariadb: true
- minio: true
- mongodb: true
- mysql8: true
- neo4j: true
- ohmyzsh: true
- openresty: true
- pm2: true
- python: true
- rabbitmq: true
- solr: true
- webdriver: true
MariaDB
MariaDBを有効化すると、MySQLは削除され、MariaDBがインストールされます。MariaDBはMySQLの完全な互換なので、アプリケーションデータベースの設定では、mysqlというデータベースドライバを引き続き使用できます。
MongoDB
デフォルトのMongoDBでは、データベースのユーザ名はhomestead、対応するパスワードはsecretに設定されています。
Elasticsearch
Elasticsearchのバージョンは、メジャーバージョンを指定するか、正確なバージョン番号(メジャー.マイナー.パッチ の形式)で指定できます。デフォルトのインストールでは、「homestead」という名前のクラスタを作成します。ElasticsearchにOSのメモリの半分以上を使わせるべきではないので、Homesteadマシンのメモリの過半数をElasticsearchアプリケーションに割り当てないでください。
設定をカスタマイズする方法については、Elasticsearchドキュメントを参照してください。
Neo4j
デフォルトでインストールしたNeo4jは、データベースのユーザ名にhomesteadが設定され、対応するパスワードはsecretになっています。Neo4jブラウザにアクセスするには、Webブラウザでhttp://homestead.test:7474を開いてください。Neo4jクライアントのために、7687 (Bolt)、7474 (HTTP)、7473 (HTTPS)のポートが用意されています。
エイリアス
Homesteadディレクトリのaliasesファイルを編集して、HomesteadマシンへのBashエイリアスを追加しましょう。
alias c='clear'
alias ..='cd ..'
aliasesファイルをアップデートしたら、vagrant reload --provisionコマンドでHomesteadマシンを再度プロビジョニングする必要があります。これによって、新しいエイリアスがマシン上で利用できるようになります。
よくある使い方
Homesteadへのグローバルアクセス
ファイルシステムのどこからでも vagrant upコマンドでHomesteadマシンを起動したいと思うかもしれません。Mac / Linuxをご利用の場合は、Bash関数をBash profileに追加することで実現できます。Windowsをご利用の場合は、PATHにバッチファイルを追加することで同様に実現可能です。これらのスクリプトは、システムのどこからでもVagrantコマンドを実行できるようにし、そのコマンドを自動でHomesteadのインストール先に渡してくれます。
Mac / Linux
function homestead() {
( cd ~/Homestead && vagrant $* )
}
関数内の~/Homesteadパスは、実際にHomesteadがインストールされている場所に合わせて書き換えてください。関数をインストールしたら、システムのどこからでもhomestead up やhomestead sshのようにコマンドを実行できます。
和訳者メモ
macOS「Catalina」では、デフォルトシェルがbashからzshに変更されているのでご注意ください。特にこだわりがなければ、bashをご利用の場合は
~/.bash_profileに、zshをご利用の場合は~/.zprofileに上述のスクリプトを書き込んでください。
Windows
どこにでもいいのでhomestead.batというバッチファイルを作成し、以下の内容を書き込んでください。
@echo off
set cwd=%cd%
set homesteadVagrant=C:\Homestead
cd /d %homesteadVagrant% && vagrant %*
cd /d %cwd%
set cwd=
set homesteadVagrant=
スクリプト内で例としてあげたC:\Homesteadパスは、実際にHomesteadがインストールされている場所に合わせて書き換えてください。ファイルを作成した後、ファイルがある場所をPATHに追加してください。そうすれば、システムのどこからでもhomestead up やhomestead sshのようなコマンドが実行できるようになります。
SSHを用いた接続
Homesteadディレクトリでvagrant sshコマンドを実行すると、SSHで仮想マシンにアクセスできます。
ただし、HomesteadマシンへのSSHアクセスは頻繁に利用するので、前の項でご紹介した関数を追加した方が、Homestead Boxに素早くSSHでアクセスできておすすめです。
データベースへの接続
homesteadのデータベースでは、MySQLとPostgreSQLが最初から使えるようになっています。ホストマシンのデータベースクライアントからMySQLかPostgreSQLデータベースにアクセスするには、127.0.0.1の33060番ポート(MySQL)または54320番ポート(PostgreSQL)に接続してください。どちらのデータベースでも、ユーザ名とパスワードは、homestead / secretです。
ホストマシンからデータベースに接続するときには、このように一般的ではないポートのみを使用してください。Laravelは仮想マシン内で動いているので、標準的な3306と5432ポートをLaravelのデータベース設定に使用します。
和訳者メモ
私の環境では、ホストマシンからHomesteadのMySQLに接続しようとすると、以下のようなエラーが発生しました。
$ mysql -h 127.0.0.1 -P 33060 -u homestead -psecret ERROR 2007 (HY000): Protocol mismatch; server version = 11, client version = 10ホストマシンのMySQLデーモンが
33060番ポートをバインドしていることが原因のようだったので、ホストマシン上のMySQLデーモンを停止させた状態でHomesteadを起動し、解決しました。$ brew services stop mysql $ homestead reload --provision $ mysql -h 127.0.0.1 -P 33060 -u homestead -psecret mysql>
データベースのバックアップ
Homesteadには、Vagrant Boxが破棄されたときに、自動的にデータベースのバックアップを作成する機能があります。この機能を利用するには、Vagrantのバージョン2.1.0以上を使用している必要があります。古いバージョンのVagrantを使用している場合には、vagrant-triggersというプラグインをインストールしてください。Homestead.yamlファイルに以下の行を追加することで、データベースの自動バックアップを有効化できます。
backup: true
設定した後、vagrant destroyコマンドを実行すると、Homesteadは、データベースをmysql_backupとpostgres_backupディレクトリに出力します。これらのディレクトリは、クローンしたHomesteadディレクトリにありますが、プロジェクト単位のインストールを使用した場合は、プロジェクトのルートディレクトリにあります。
データベースのスナップショット
Homesteadでは、MySQLロジカルマネージャを利用することで、MySQLとMariaDBの状態の凍結とブランチが可能です。例えば、数ギガバイトのデータベースを持つサイトで作業していても、データベースをインポートして、スナップショットをとることができます。それから必要な作業をして、ローカルにテストコンテンツを作成した後、すぐに元の状態に戻せます。
内部では、コピーオンライトをサポートしたLVMの薄いスナップショット機能をLMMが利用しています。つまり、テーブルの一つの行を書き換えるということは、書き込んだ変更がただディスクに移されるというだけなので、大幅に時間を短縮し、リストア中のディスク容量を節約できます。
lmmコマンドはLVMの操作に使用するので、rootで実行する必要があります。実行可能な全てのコマンドを確認するには、Vagrant Box内でsudo lmmコマンドを実行してください。一般的な流れは、以下のようになります。
- デフォルトのlmmの
masterブランチにデータベースをインポートする。 -
sudo lmm branch prod-YYYY-MM-DDコマンドを使用して、変更前のデータベースのスナップショットを保存する。 - データベースを編集する。
-
sudo lmm merge prod-YYYY-MM-DDコマンドを実行して、全ての変更をなかったことにする。 -
sudo lmm delete <branch>コマンドを実行して、必要なくなったブランチを削除する。
サイトの追加
Homestead環境をプロビジョニングして実行したあとに、Laravelアプリケーションに新しいNginxサイトを追加したいことがあります。一つのHomestead環境で、何個でもLaravelは実行できます。サイトを追加するには、Homestead.yamlファイルにサイトを追加してください。
sites:
- map: homestead.test
to: /home/vagrant/project1/public
- map: another.test
to: /home/vagrant/project2/public
Vagrantがhostsファイルを自動管理していない場合は、hostsファイルにも新しいサイトを追加する必要があります。
192.168.10.10 homestead.test
192.168.10.10 another.test
サイトを追加できたら、Homesteadディレクトリでvagrant reload --provisionコマンドを実行してください。
サイトの種類
Homesteadでは、Laravelベースではないプロジェクトを簡単に実行できるようにするため、数種類のサイトがサポートされています。例えば、symfony2というサイトタイプを使用すると、SymfonyアプリケーションをHomesteadに簡単に追加できます。
sites:
- map: symfony2.test
to: /home/vagrant/my-symfony-project/web
type: "symfony2"
利用可能なサイトのタイプは次の通りです:apache, apigility, expressive, laravel (デフォルト), proxy, silverstripe, statamic, symfony2, symfony4, zf
サイトパラメータ
paramsというサイトディレクティブを使用して、Nginxのfastcgi_param値をサイトに追加できます。例えば、以下ではBARという値を持ったFOOパラメータを追加しています。
sites:
- map: homestead.test
to: /home/vagrant/project1/public
params:
- key: FOO
value: BAR
環境変数
Homestead.yamlに書き加えることで、グローバル環境変数を設定できます。
variables:
- key: APP_ENV
value: local
- key: FOO
value: bar
Homestead.yamlを編集したら、必ずvagrant reload --provisionコマンドを実行して、再度マシンをプロビジョニングしてください。インストールしている全PHPバージョンのPHP-FPMの設定がアップデートされ、vagrantユーザの環境もアップデートされます。
ワイルドカードSSL
Homesteadでは、Homestead.yamlファイルのsites:セクションに定義したサイトそれぞれに、自己署名付きのSSL証明書が設定されます。サイトのワイルドカードSSL証明書を生成したい場合は、サイト設定にwildcardオプションを追加してください。サイトは、特定ドメインの証明書ではなく、ワイルドカード証明書を使用するようになります。
- map: foo.domain.test
to: /home/vagrant/domain
wildcard: "yes"
use_wildcardオプションがnoになっている場合、ワイルドカード証明書は生成されますが、使用されません。
- map: foo.domain.test
to: /home/vagrant/domain
wildcard: "yes"
use_wildcard: "no"
Cronスケジュールの設定
Laravelでは、Cronジョブのスケジュールを簡単に使えるようにするため、Artisanコマンドのschedule:runを1分ごとに実行するようスケジューリングされています。schedule:runコマンドは、App\Console\Kernelにジョブスケジュールが設定されているかどうかによって、ジョブを実行するか判断します。
サイトに対してschedule:runコマンドを実行したい場合は、サイト設定のscheduleオプションにtrueを設定してください。
sites:
- map: homestead.test
to: /home/vagrant/project1/public
schedule: true
サイトのCronジョブは、仮想マシンの/etc/cron.dフォルダ内に定義されます。
Mailhogの設定
Mailhogを使用すると、実際にメールを受信者に送信しなくても、メールを取得できるようになります。使用するにあたって、.envファイルのメール設定を以下のように書き換えてください。
MAIL_MAILER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
Mailhogの設定が終わったら、http://localhost:8025を開いて、Mailhogダッシュボードにアクセスできます。
Minioの設定
Minioは、Amazon S3と互換性のあるAPIを備えた、オープンソースのオブジェクトストレージサーバです。Minioをインストールするには、Homestead.yamlのfeaturesセクションに以下の設定オプションを書き加えてください。
minio: true
デフォルトでは、Minioは9600番ポートで利用できます。Minioのコントロールパネルにアクセスするには、http://localhost:9600/を開いてください。デフォルトのアクセスキーはhomesteadで、シークレットキーはsecretkeyです。Minioにアクセスする際には、常にus-east-1リージョンを使用してください。
Minioを使用するために、config/filesystems.phpという設定ファイルで、S3のディスク設定を調整する必要があります。ディスク設定にuse_path_style_endpointオプションを追加し、urlキーをendpontに変更してください。
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'endpoint' => env('AWS_URL'),
'use_path_style_endpoint' => true,
]
最後に、.envに以下のオプションが含まれていることを確認してください。
AWS_ACCESS_KEY_ID=homestead
AWS_SECRET_ACCESS_KEY=secretkey
AWS_DEFAULT_REGION=us-east-1
AWS_URL=http://localhost:9600
バケットをプロビジョニングするには、Homesteadの設定ファイルにbucketsディレクティブを追加してください。
buckets:
- name: your-bucket
policy: public
- name: your-private-bucket
policy: none
policyの値には、none, download, upload, publicが使用できます。
ポート
デフォルトでは、以下のポートがHomestead環境に転送(ポートフォワーディング)されます。
- SSH: 2222 → 22 に転送
- ngrok UI: 4040 → 4040 に転送
- HTTP: 8000 → 80 に転送
- HTTPS: 44300 → 443 に転送
- MySQL: 33060 → 3306 に転送
- PostgreSQL: 54320 → 5432 に転送
- MongoDB: 27017 → 27017 に転送
- Mailhog: 8025 → 8025 に転送
- Minio: 9600 → 9600 に転送
ポートフォワーディングの追加
必要なら、特定のプロトコル以外にも、追加のポートフォワーディングをVagrant Boxに設定できます。
ports:
- send: 50000
to: 5000
- send: 7777
to: 777
protocol: udp
環境の共有
今やっていることを同僚やクライアントと共有したい場合があると思います。Vagrantのvagrant shareコマンドを使用すれば、これが可能になります。ただし、Homestead.yamlファイルで複数のサイトを構成している場合には、使用できません。
この問題を解決するために、Homestead自体にもshareコマンドが搭載されています。これを使用するには、vagrant sshコマンドでHomesteadマシンにSSH接続したあと、share homestead.testコマンドを実行します。すると、設定ファイルのHomestead.yamlからhomestead.testというサイトが共有されます。他に構築しているサイトがあれば、homestead.testの代わりに使用できます。
share homestead.test
コマンドを実行すると、Ngrokの画面が表示され、そこにはアクティビティログと、共有したサイトの公開URLが含まれています。任意のリージョンやサブドメインなど、Ngrokのランタイムオプションを指定したい場合は、shareコマンドにそれらを付け加えることで実現可能です。
share homestead.test -region=eu -subdomain=laravel
注意
忘れないで欲しいのは、Vagrantは本質的に安全ではなく、
shareコマンドを実行すれば、仮想マシンがインターネット上に晒されてしまうということです。
複数のPHPバージョン
Homestead 6から、同じ仮想マシン上で複数のバージョンのPHPがサポートされるようになりました。Homestead.yamlファイルで、サイトに使用するPHPバージョンを指定できます。利用可能なPHPバージョンは、"5.6", "7.0", "7.1", "7.2", "7.3", "7.4" (デフォルト)です。
sites:
- map: homestead.test
to: /home/vagrant/project1/public
php: "7.1"
さらに、コマンドライン上では、サポートされているPHPバージョンを全て利用できます。
php5.6 artisan list
php7.0 artisan list
php7.1 artisan list
php7.2 artisan list
php7.3 artisan list
php7.4 artisan list
また、Homesteadの仮想マシン内で以下のコマンドを実行すると、デフォルトのCLIバージョンを変更できます。
php56
php70
php71
php72
php73
php74
Webサーバ
Homesteadでは、デフォルトでWebサーバにNginxを使用します。ただし、サイトタイプにapacheを指定すれば、Apacheをインストールすることもできます。両方のWebサーバを同時にインストールすることはできますが、同時に動かすことはできません。flipというシェルコマンドを使用すれば、Webサーバを簡単に切り替えられます。flipコマンドは、起動しているWebサーバがどちらであるかを自動的に判別して停止し、もう片方のサーバを起動します。このコマンドを使用するには、HomesteadマシンにSSHで接続し、ターミナルで以下のコマンドを実行してください。
flip
メール
Homesteadには、Postfixというメール転送エージェントが含まれており、デフォルトで1025番ポートを使用しています。なので、localhostの1025番ポートでsmtpのメールドライバを使用するように設定してください。そして、送信されたメールは全て、Postfixによって処理され、Mailhogによって取得されます。送信したメールを確認するには、ブラウザでhttp://localhost:8025にアクセスしてください。
デバッグ&分析
Xdebugを用いたWebリクエストのデバッグ
Homesteadでは、Xdebugを使用したステップ実行がサポートされています。例えば、ブラウザでWebページを読み込むと、PHPはIDEに接続して、動いているコードの検査や修正を可能にします。
Xdebugはデフォルトで既に起動していて、いつでも接続できます。コマンドラインでXdebugを有効化する必要がある場合は、Vagrant Box内でsudo phpenmod xdebugコマンドを実行してください。次は、IDEの指示に従って、デバッグを有効化してください。最後に、ブックマークレットや拡張を使用して、Xdebugを起動するようにブラウザを設定してください。
注意
Xdebugを使用すると、PHPの動作は著しく遅くなります。Xdebugを無効にするには、Vagrant Box内で
sudo phpdismod xdebugコマンドを実行し、FPMサービスを再起動してください。
CLIアプリケーションのデバッグ
PHPのCLIアプリケーションをデバッグするには、Vagrant Box内でxphpというシェルエイリアスを使用します。
xphp path/to/script
Xdegugの自動起動
Webサーバのリクエストを作成する機能テストをデバッグする場合、デバッグするためにカスタムヘッダやCookieを使用するように変更するより、自動起動のデバッグを使用した方が簡単です。Xdebugを自動起動にする方法は、Vagrant Box内の/etc/php/7.x/fpm/conf.d/20-xdebug.iniを編集し、以下の設定を追記してください。
; ここに記述すべきIPアドレスは、Homestead.yamlに記載されているIPアドレスです。
xdebug.remote_host = 192.168.10.1
xdebug.remote_autostart = 1
Blackfireを用いたアプリケーションの分析
Blackfireは、WebリクエストとCLIアプリケーションを分析し、パフォーマンスアサーションの記述ができるSaaSサービスです。分析データをコールグラフとタイムラインで表示する、インタラクティブなユーザーインターフェースを提供します。開発環境でも、ステージングでも、本番環境でも、エンドユーザに影響を与えずに使用できます。コードと設定ファイルphp.iniに対して、パフォーマンス、クオリティ、セキュリティのチェックができます。
Blackfire Playerは、分析方法を記述するためにBlackfireと共に使用できる、オープンソースのWebクローラ / Webテスト / Webスクレイピングアプリケーションです。
Blackfireを有効化するには、Homesteadの設定ファイル内の「features」設定を使用します。
features:
- blackfire:
server_id: "server_id"
server_token: "server_value"
client_id: "client_id"
client_token: "client_value"
Blackfireサーバの資格情報とクライアントの資格情報には、ユーザアカウントが必要です。Blackfireには、アプリケーションを分析するために、コマンドラインツールとブラウザ拡張を含めた様々なオプションがあります。詳細は、Blackfireのドキュメントをご覧ください。
XHGuiを用いたPHPパフォーマンスの分析
XHGuiは、PHPアプリケーションのパフォーマンスを調査するためのユーザインターフェースです。XHGuiを有効化するには、サイト設定にxhgui: 'true'を加えてください。
sites:
-
map: your-site.test
to: /home/vagrant/your-site/public
type: "apache"
xhgui: 'true'
サイトが既に存在している場合、設定を更新した後にvagrant provisionコマンドを実行してください。
Webリクエストを分析するには、リクエストのクエリパラメータにxhgui=onを追加してください。XHGuiは、レスポンスに自動でCookieを付与するので、次回のリクエストにクエリパラメータは必要ありません。また、アプリケーションの分析結果を閲覧するには、ブラウザでhttp://your-site.test/xhguiにアクセスしてください。
XHGuiを使用してCLIリクエストを分析するには、コマンドの前にXHGUI=onを付与してください。
XHGUI=on path/to/script
CLIの分析結果は、Webの分析結果と同じように閲覧できます。
分析を行うと、スクリプトの実行速度が遅くなり、実時間が実際のリクエストの約2倍になることに注意してください。したがって、実際の数字ではなく、常に改善率を比較するようにしてください。また、実行時間には、デバッガ内で一時停止される時間も含まれています。
分析を行うと、ディスクスペースの大部分を消費してしまうので、数日経つと自動的に消去されます。
ネットワークインターフェース
Homestead.yamlのnetworksプロパティは、Homestead環境のネットワークインターフェースを構成します。インターフェースは、必要な数だけ構成できます。
networks:
- type: "private_network"
ip: "192.168.10.20"
ブリッジインターフェースを有効化するには、bridge設定を追加し、ネットワークタイプをpublic_networkに変更してください。
networks:
- type: "public_network"
ip: "192.168.10.20"
bridge: "en1: Wi-Fi (AirPort)"
DHCPを有効化するには、設定からipオプションを削除してください。
networks:
- type: "public_network"
bridge: "en1: Wi-Fi (AirPort)"
Homesteadの拡張
Homesteadディレクトリのルートにあるafter.shを使用すると、Homesteadを拡張できます。このファイルには、仮想マシンの設定やカスタマイズのためのシェルコマンドを記述できます。
Homesteadをカスタマイズするとき、Ubuntuは、パッケージの元の設定を維持するか、新しい設定ファイルで上書きするかを確認する場合があります。これを回避するには、パッケージをインストールする際に以下のコマンドを使用して、Homesteadで以前に書かれた設定を上書きしないようにします。
sudo apt-get -y \
-o Dpkg::Options::="--force-confdef" \
-o Dpkg::Options::="--force-confold" \
install your-package
ユーザカスタマイズ
チーム設定でHomesteadを使用する場合、個人の開発スタイルに合わせるために、Homesteadを微調整できます。Homesteadディレクトリ(Homestead.yamlがあるのと同じディレクトリ)のルートに、user-customizations.shというファイルを作成してください。このファイル内には、独自のカスタマイズを作成できます。ただし、user-customizations.shはバージョン管理しないでください。
Homesteadのアップデート
Homesteadをアップデートする前に、Homesteadディレクトリで以下のコマンドを実行し、現在の仮想マシンを削除する必要があります。
vagrant destroy
次に、Homesteadのソースコードをアップデートする必要があります。レポジトリをクローンしている場合、レポジトリをクローンした場所で以下のコマンドを実行してください。
git fetch
git pull origin release
これらのコマンドは、GitHubレポジトリからHomesteadの最新のコードを取得し、latestタグをフェッチしてから、latestタグのついたリリースにチェックアウトしています。最新の安定版のリリースバージョンは、GitHubリリースページで確認できます。
プロジェクトのcomposer.jsonファイルを介してHomesteadをインストールした場合、composer.jsonファイルに"laravel/homestead": "^11"が含まれていることを確認した上で、依存関係をアップデートしてください。
composer update
それから、vagrant box updateコマンドを使用して、Vagrant Boxをアップデートします。
vagrant box update
次に、追加の設定ファイルをアップデートするために、Homesteadディレクトリでbash init.shコマンドを実行します。すると、既に存在するHomestead.yaml、after.sh、aliasesファイルを上書きするか尋ねられます。
// Mac / Linux...
bash init.sh
// Windows...
init.bat
最後に、Homestead Boxを再構築して、最新のVagrantをインストールしてください。
vagrant up
プロバイダ固有の設定
VirtualBox
デフォルトで、Homesteadはnatdnshostresolverをonに設定しています。これは、ホストOSのDNS設定をHomesteadが使用できるようにするものです。この設定を上書きしたい場合は、Homestead.yamlファイルに以下の行を追加してください。
provider: virtualbox
natdnshostresolver: 'off'
Windowsでのシンボリックリンク
Windowsマシンでシンボリックリンクがうまく動作しない場合は、以下のブロックをVagrantfileファイルに書き加える必要があります。
config.vm.provider "virtualbox" do |v|
v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end
Valet
はじめに
Valetは、Macを使っているミニマリストのためのLaravel開発環境です。Vagrantも/etc/hostsファイルも使いません。公開しているサイトの共有も、ローカルトンネルを使用します。
Valetは、マシンを起動すると、常にNginxをバックグラウンドで起動するように設定します。そして、DnsMasqを使用すれば、Valetは*.testドメインへの全てのリクエストを、ローカルマシンにインストールしているサイトへプロキシします。
言い換えると、RAM(メモリ)を7MB程度しか使用しない爆速Laravel開発環境です。ValetはVagrantやHomesteadに完全に取って代わる存在にはなりませんが、柔軟性のある基本的な機能が欲しかったり、極端なスピードを求めていたり、RAMが限られているマシンで作業する場合には、素晴らしい代替手段になります。
Valetは最初から以下をサポートしていますが、これ以外が使用できないということではありません。
- Laravel
- Lumen
- Bedrock
- CakePHP 3
- Concrete5
- Contao
- Craft
- Drupal
- ExpressionEngine
- Jigsaw
- Joomla
- Katana
- Kirby
- Magento
- OctoberCMS
- Sculpin
- Slim
- Statamic
- Static HTML
- Symfony
- WordPress
- Zend
いずれにしろ、カスタムドライバを使用すればValetを拡張できます。
ValetかHomesteadか
ご存知の通り、Laravelはローカルの開発環境としてHomesteadも提供しています。HomesteadとValetは、対象としているユーザと、ローカル開発へのアプローチという点において異なっています。Homesteadは、自動化されたNginx設定が入ったUbuntuの仮想マシン全体を提供します。仮想化されたLinuxの開発環境が欲しい場合や、Windows / Linuxを使用している場合には、Homesteadを使うのは素晴らしい選択肢となります。
ValetはMacしかサポートしておらず、PHPとデータベースサーバをローカルマシン上に直接インストールする必要があります。PHPとデータベースサーバは、Homebrewのbrew install phpとbrew install mysqlというコマンドを使用すれば、簡単に入手できます。Valetは、最小限のリソース消費で爆速のローカル開発環境を構築できるので、必要なものはPHP / MySQLだけであり、完全に仮想化された開発環境が必要でない人には最適です。
ValetもHomesteadも、Laravelの開発環境を構築するとても便利なものです。どちらを使うかは、個人的な好みと、チームが必要としているものによるでしょう。
インストール
Valetは、macOSとHomebrewを必要とします。Valetをインストールする前に、ApacheやNginxなどの他のプログラムが、ローカルマシンの80番ポートにバインドされていないことを確認してください。
-
Homebrewをインストールするか、
brew updateコマンドを使用して最新バージョンにアップデートしてください。 -
Homebrewの
brew install phpコマンドでPHP 7.4をインストールしてください。 -
Composerをインストールしてください。
-
Composerの
composer global require laravel/valetコマンドでValetをインストールしてください。~/.composer/vendor/binディレクトリがシステムの「PATH」に含まれている必要があります。 -
valet installコマンドを実行してください。ValetとDnsMasqの構築とインストールが行われ、システム起動時に実行されるValetデーモンが登録されます。
Valetのインストールが終わったら、ping foobar.testのようなコマンドをターミナルで実行して、*.testドメインにpingを試してみてください。Valetが正常にインストールされている場合、このドメインは127.0.0.1で応答するはずです。
Valetは、マシンが起動するたびに自動でデーモンを始動させます。一度Valetをインストールしてしまえば、valet startやvalet installのようなコマンドを実行する必要はありません。
データベース
データベースが必要な場合、コマンドラインで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
注意
複数のバージョンのPHPがインストールされている場合でも、Valetでは一度に一つのバージョンしか使用できません。
リセット
Valetのインストールで問題が発生して正しく実行できない場合は、composer global updateコマンドの後でvalet installを実行すると、インストールしたものをリセットして、問題を解決できます。まれにValetの「ハードリセット」が必要な場合がありますが、その場合は、valet uninstall --forceコマンドの後でvalet installを実行してください。
アップデート
Valetをアップデートするには、ターミナルでcomposer global updateコマンドを実行します。アップデートしたあと、valet installコマンドを実行すると、設定ファイルが更新されます。
サイトの配信
Valetのインストールができたら、サイトを配信する準備は整っています。Valetには、parkとlinkというLaravelのサイトを配信するのに便利な二つのコマンドがあります。
Parkコマンド
-
mkdir ~/Sitesのようなコマンドを実行して、新しいディレクトリをMac上に作成します。次に、cd ~/Sitesとvalet parkを実行します。すると、Valetがサイトを探すパスとして、カレントディレクトリが登録されます。 -
laravel new blogコマンドで、このディレクトリに新しいLaravelサイトを作成します。 -
ブラウザで
http://blog.testを開きます。
**
これだけです。**これだけで、「park」したディレクトリに作成したLaravelプロジェクトは、http://folder-name.testで配信されます。
Linkコマンド
linkもLaravelサイトを配信するのに使用します。このコマンドは、ディレクトリ全体ではなく、ディレクトリ内で一つのみサイトを配信する場合に便利です。
-
このコマンドを使用するには、プロジェクトを開き、ターミナルで
valet link app-nameを実行します。すると、カレントディレクトリを指すシンボリックリンクが~/.config/valet/Sitesに作成されます。 -
linkコマンドを実行したら、ブラウザでhttp://app-name.testを開いてサイトにアクセスできます。
リンクしたディレクトリの一覧は、valet linksコマンドで確認できます。valet unlink app-nameを使用すると、シンボリックリンクを破棄できます。
ヒント
valet linkを使用することで、一つのプロジェクトを複数の(サブ)ドメインで配信できます。プロジェクトにサブドメインや他のドメインを追加するには、プロジェクトフォルダでvalet link subdomain.app-nameを実行してください。
TLSを用いたサイトの暗号化
デフォルトでは、ValetはHTTPでサイトを配信します。しかし、HTTP/2を使用して暗号化されたTLSでサイトを配信したい場合は、secureコマンドを使用してください。例えば、laravel.testドメインでサイトを配信しているときには、以下のコマンドを実行して暗号化できます。
valet secure laravel
暗号化をやめて、HTTPでの配信に戻したい場合、unsecureコマンドを使用してください。secureコマンドと同じように、このコマンドにも暗号化をやめたいホスト名を指定します。
valet unsecure laravel
サイトの共有
Valetには、ローカルのサイトを全世界に共有するコマンドも含まれていて、モバイルデバイスでのテスト、チームやクライアントとの共有を簡単に行えます。Valetがインストールされていれば、追加のソフトウェアインストールは必要ありません。
Ngrokを用いたサイトの共有
サイトを共有するには、ターミナルでサイトのディレクトリまで移動し、valet shareコマンドを実行してください。公開URLがクリップボードにコピーされ、ブラウザに直接ペーストしたり、チームと共有することが可能です。
サイトの共有を停止するには、Control + Cでプロセスを中止してください。
valet share --region=euのように、shareコマンドには追加のパラメータを渡すこともできます。詳しくは、ngrokドキュメントを参照してください。
Exposeを用いたサイトの共有
Exposeをインストールしている場合、ターミナルでサイトのディレクトリに移動し、exposeコマンドを実行することで、サイトを共有できます。サポートされているコマンドラインのパラメータについては、Exposeのドキュメントを参照してください。サイトを共有すると、他のデバイスやチームメンバーと共有できるURLが表示されます。
サイトの共有を停止するには、Control + Cでプロセスを中止してください。
ローカルネットワーク上でのサイト共有
Valetは、デフォルトで、受け入れる通信を127.0.0.1の内部に限定しています。これによって、開発マシンがインターネットに晒されて、セキュリティリスクが生じることを防いでいます。
ローカルネットワーク内の他のデバイスから、マシンのIPアドレス(例:192.168.1.10/app-name.test)を使ってValetのサイトにアクセスさせたい場合は、Nginxの設定ファイルを編集し、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というグローバル配列に追加されます。
<?php
// foo.test サイトの $_SERVER['key'] に "value" を設定する
return [
'foo' => [
'key' => 'value',
],
];
// 全てのサイトの $_SERVER['key'] に "value" を設定する
return [
'*' => [
'key' => 'value',
],
];
プロキシサービス
Valetのドメインを、ローカルマシン内の他のサービスにプロキシしたい場合があると思います。例えば、Dockerで別のサイトを起動している間に、Valetも起動する必要がある場合です。しかし、ValetとDockerが同時に80番ポートをバインドすることはできません。
これを解決するには、proxyコマンドを使用して、プロキシを生成します。以下は、http://elasticsearch.testへの全てのトラフィックをhttp://127.0.0.1:9200にプロキシする例です。
valet proxy elasticsearch http://127.0.0.1:9200
unproxyコマンドを使えば、プロキシを削除できます。
valet unproxy elasticsearch
proxiesコマンドを使えば、プロキシされている全てのサイト構成を一覧表示できます。
valet proxies
カスタムValetドライバ
独自のValetドライバを書くことで、ValetがサポートしていないフレームワークやCMSで動いているPHPアプリケーションを配信できます。Valetをインストールすると、SampleValetDriver.phpファイルが入った~/.config/valet/Driversディレクトリが作成されます。このファイルには、カスタムドライバの書き方について説明するための、簡単なドライバが実装されています。ドライバを書くのに必要な実装は、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のためのカスタムValetドライバを書いた場合、ファイル名はWordPressValetDriver.phpとします。
それぞれのメソッドのサンプル実装を見てみましょう。
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;
}
注意
isStaticFileメソッドが呼び出されるのは、servesメソッドがリクエストに対してtrueを返し、かつリクエストURIが/ではなかった場合のみです。
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';
}
}
その他のValetコマンド
| コマンド | 説明 |
|---|---|
valet forget |
parkしたディレクトリで実行することで、parkしたディレクトリのリストから削除します。 |
valet log |
Valetのサービスによって書かれたログの一覧を表示します。 |
valet paths |
全てのparkしたパスを表示します。 |
valet restart |
Valetデーモンを再起動します。 |
valet start |
Valetデーモンを起動します。 |
valet stop |
Valetデーモンを停止します。 |
valet trust |
sudoersファイルにBrewとValetを追加して、パスワード入力なしでValetコマンドを実行できるようにします。 |
valet uninstall |
Valetをアンインストールします。手動アンインストールのための説明が表示されますが、--forceパラメータを使用することで、強制的にValetを全て削除することもできます。 |
Valetディレクトリ&ファイル
Valet環境で起きた問題をトラブルシューティングする際には、以下のディレクトリとファイルの説明が参考になります。
| File / Path | Description |
|---|---|
~/.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設定ファイルです。 |
デプロイ
はじめに
Laravelアプリケーションを本番環境にデプロイする準備ができたら、アプリケーションを効率的に実行させるために、やるべきことがいくつかあります。この章では、Laravelアプリケーションが適切にデプロイするための重要なポイントを解説します。
サーバの設定
Nginx
Nginxが動いているサーバにアプリケーションをデプロイする場合、Webサーバの設定として、以下の設定ファイルを参考にしてください。ほとんどの場合、サーバの設定に応じてカスタマイズが必要です。サーバの管理にサポートが必要な場合は、Laravel Forgeのようなサービスの利用を検討してください。
server {
listen 80;
server_name example.com;
root /srv/example.com/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
最適化
オートローダの最適化
本番環境へデプロイするとき、Composerのクラス・オートローダ・マップを最適化することで、Composerは指定されたクラスのファイルを素早く読み込めるようになります。
composer install --optimize-autoloader --no-dev
ヒント
オートローダの最適化に加えて、プロジェクトのソース管理リポジトリに
composer.lockファイルを含めるようにしてください。composer.lockがある方が、プロジェクトの依存関係をより速くインストールできます。
設定の読み込みの最適化
アプリケーションを本番環境にデプロイするとき、デプロイの流れの中でArtisanコマンドのconfig:cacheを実行するようにしてください。
php artisan config:cache
このコマンドは、全てのLaravelの設定ファイルを一つのキャッシュファイルにまとめることで、設定値を読み込む時にフレームワークが参照しなければいけないファイル数を大幅に減らします。
注意
デプロイの流れの中で
config:cacheコマンドを実行する場合、設定ファイル内でのみenv関数が呼び出されるようにしてください。設定がキャッシュされると、.envファイルは読み込まれなくなり、env関数は全ての呼び出しに対してnullを返します。
ルートの読み込みの最適化
多くのルートを持つ大規模なアプリケーションを構築する場合、デプロイの流れの中でArtisanコマンドのroute:cacheを実行してください。
php artisan route:cache
このコマンドは、全てのルート登録をキャッシュファイル内の単一のメソッド呼び出しに集約させ、何百ものルートを登録した場合のパフォーマンスを向上させます。
ビューの読み込みの最適化
本番環境にアプリをデプロイするとき、デプロイの流れの中でArtisanコマンドのview:cacheを実行する必要があります。
php artisan view:cache
このコマンドは、全てのBladeビューをプリコンパイルすることで、要求されたときにコンパイルされるのを防ぎ、ビューを返すリクエストのパフォーマンスを向上させます。
Forge / Vaporを使ったデプロイ
自分でサーバの設定を管理する準備ができていなかったり、強靭なLaravelアプリケーションを実行するのに必要なさまざまなサービスを全て設定することに抵抗がある場合、Laravel Forgeは素晴らしい代替手段です。
Laravel Forgeは、DigitalOceanやLinodeやAWSなど、さまざまなインフラプロバイダ上でサーバを作成できます。加えて、Forgeは、NginxやMySQL、Redis、Memcached、Beanstalkなど、強靭なLaravelアプリケーションを構築するのに必要な全てのツールのインストールと管理を行います。
Laravel Vapor
完全にサーバレスで、オートスケール開発プラットフォームにチューニングされたLaravelを使用したい場合、Laravel Vaporを参照してください。Laravel Vaporは、AWSを利用した、Laravelのサーバレス開発プラットフォームです。LaravelのインフラをVaporで立ち上げ、サーバレスでシンプルにスケールできます。Laravel Vaporは、Laravelの開発者によって、フレームワークとシームレスに動作するようにチューニングされているので、今までと同じようにLaravelアプリケーションを書くことができます。