Laravel 8 を体系的に学べる公式チュートリアル和訳

## この記事について

 

* この記事は、Laravel 8 のGetting Startedを和訳したものです。

* 公式のチュートリアルなので、安心して、かつ効率的に学習することができます。

* Laravelのインストールとその設定、各種ツールの説明まで網羅されているので、初学者がLaravel 8 に初めて触れたり、中級者が基礎を振り返るのに最適です。

* 読者に誤解を与えない部分は、読みやすさを重視して適宜意訳しています。

* 英語の記事へのリンクを日本語の記事へのリンクに変更したり、新しくリンクを追加している部分があります。

* DeepL等を使用して推敲は行っていますが、間違っているところやより良い表現があれば、どんどん編集リクエストをお願いいたします。 

* 文頭にある:mag:は、原文のリンクになっています。



> **翻訳元**
>
> laravel / docs : [https://github.com/laravel/docs/tree/8.x](https://github.com/laravel/docs/tree/8.x)
>
> ライセンス : [MIT](https://github.com/laravel/docs/blob/8.x/license.md)


&nbsp;
## インストール



### サーバに必要なもの

[:mag:](https://laravel.com/docs/8.x/installation#server-requirements) Laravelを使用するためには、いくつか必要なものがあります。[Laravel Homestead](#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拡張


&nbsp;
### Laravelをインストールする

[:mag:](https://laravel.com/docs/8.x/installation#installing-laravel) Laravelは、依存関係の管理に[Composer](https://getcomposer.org/)を利用しています。なので、Laravelをインストールする前に、Composerがインストールされていることを確かめてください。

> **和訳者メモ**
>
> Macをご利用の場合は、HomeBrewでインストールできます。
>
> ```sh
> brew install composer
> ```
>
> 


&nbsp;
#### Laravelインストーラを使用する方法

まず、Composerを使用して、Laravelインストーラをダウンロードします。



```sh
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の依存関係がすでにインストールされた状態のプロジェクトを配置します。



```sh
laravel new blog
```



> **ヒント**
>
> ログインや登録などの機能を備えたLaravelプロジェクトを作りたいなら、[Laravel Jetstream](https://jetstream.laravel.com/)をチェックしてみてください。


&nbsp;
#### Composer Create-Projectを使用する方法

Laravelインストーラを使用する代わりに、Composerの`create-project`コマンドでも、Laravelをインストールできます。



```sh
composer create-project --prefer-dist laravel/laravel blog
```


&nbsp;
#### 開発用ローカルサーバ

PHPがすでにローカルにインストールされていて、PHPに組み込まれている開発用サーバでアプリケーションを公開したい場合、Artisanの`serve`コマンドを使用してください。このコマンドを実行すると、`http://localhost:8000`で開発用サーバが起動します。



```sh
php artisan serve
```



ローカル開発環境を強化したい場合は、[Homestead](#Homestead)と[Valet](#Valet)を利用してください。


&nbsp;
### 設定



#### 公開ディレクトリ

[:mag:](https://laravel.com/docs/8.x/installation#configuration) Laravelをインストールすると、WebサーバのドキュメントとWebルートが`public`ディレクトリに設定されます。`public`ディレクトリにある`index.php`は、アプリケーションへ入る全てのHTTPリクエストのフロントコントローラとして機能します。


&nbsp;
#### 設定ファイル

Laravelの設定ファイルは、全て`config`ディレクトリに保存されています。それぞれのオプションはドキュメント化されているので、目を通しておいてください。


&nbsp;
#### ディレクトリのパーミッション

Laravelをインストールしたら、いくつかパーミッションの設定が必要です。`storage`内のディレクトリと`bootstrap/cache`ディレクトリは、Webサーバによって書き込みができる必要があり、そうでなければLaravelは起動できません。[Homestead](#Homestead)を使用している場合、これらのパーミッションはすでに設定されています。


&nbsp;
#### アプリケーションキー

Laravelをインストールした後にしておかなければならないのが、アプリケーションキーにランダムな文字列を設定することです。ComposerかLaravelインストーラを使ってLaravelをインストールした場合は、このキーは既に`php artisan key:generate`コマンドによって設定されています。

通常、この文字列は32文字の必要があります。また、キーは`.env`という環境ファイルで設定できます。`.env.example`ファイルを`.env`という名前でコピーしていない場合は、コピーしてください。**アプリケーションキーがセットされていない場合、ユーザーセッションやその他の暗号化されたデータは安全ではありません。**


&nbsp;
#### 追加設定

Laravelはこれ以上設定を必要とせず、すぐに使い始められます。ただし、`config/app.php`ファイルとそのドキュメントには目を通しておいてください。このファイルには、`timezone`や`locale`のような、アプリケーションに応じて変更するべきオプションがいくつか含まれています。

以下のような追加コンポーネントを構成することもできます。



* [Cache](https://readouble.com/laravel/8.x/ja/cache.html)

* [Database](https://readouble.com/laravel/8.x/ja/database.html)

* [Session](https://readouble.com/laravel/8.x/ja/session.html)


&nbsp;
## Webサーバ設定



### ディレクトリ設定

[:mag:](https://laravel.com/docs/8.x/installation#directory-configuration) Laravelは、常にWebサーバに構成された「Webディレクトリ」のルートから配信される必要があります。Laravelアプリケーションを「Webディレクトリ」のサブディレクトリから配信しないでください。アプリケーション内の機密ファイルを公開してしまう恐れがあります。


&nbsp;
### URLの設定



#### Apache

[:mag:](https://laravel.com/docs/8.x/installation#pretty-urls) 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]
```


&nbsp;
#### Nginx

Nginxを使用している場合は、サイト設定に以下のディレクティブを記述して、全てのリクエストがフロントコントローラである`index.php`に流れるようにしてください。



```nginx
location / {
    try_files $uri $uri/ /index.php?$query_string;
}
```



[Homestead](#Homestead)か[Valet](#Valet)を使用している場合、URLの設定は自動で行われます。


&nbsp;
## 設定



### はじめに

[:mag:](https://laravel.com/docs/8.x/configuration#introduction) Laravelの設定ファイルは、全て`config`ディレクトリに保存されています。それぞれのオプションはドキュメント化されているので、目を通しておいてください。


&nbsp;
### 環境設定

[:mag:](https://laravel.com/docs/8.x/configuration#environment-configuration) アプリケーションが実行されている環境ごとに、別々の設定値を使用すると、便利なことがよくあります。例えば、本番環境と異なるキャッシュドライバをローカルで使用する場合などです。

これを簡単にできるようにするため、Laravelでは、PHPライブラリの[DotEnv](https://github.com/vlucas/phpdotenv)を利用しています。新しく作成したLaravelプロジェクトには、アプリケーションのルートディレクトリに`.env.example`ファイルがあります。ComposerでLaravelをインストールした場合、このファイルは自動的に`.env`としてコピーされます。それ以外の場合では、自分でファイルをコピーする必要があります。

`.env`ファイルをアプリケーションのソース管理リポジトリにコミットするべきではありません。なぜかというと、アプリケーションを使用する開発者やサーバによって、必要とする環境設定は異なるからです。もっというと、機密情報が公開されるので、悪意のある侵入者がソース管理リポジトリにアクセスした場合、セキュリティリスクになります。

チームで開発している場合、`.env.example`ファイルはアプリケーションに残しておいたほうがいいかもしれません。サンプルの設定ファイルにプレースホルダの値を入れておくことで、チーム内の他の開発者が、どの環境変数がアプリケーションの実行に必要なのかよく分かるからです。また、`.env.testing`ファイルを作成することもできます。このファイルは、PHPUnitのテストを実行したり、`--env=testing`オプションを付けてArtisanコマンドを実行した場合に、`.env`ファイルをオーバーライドします。



> `.env`ファイル内の任意の変数は、サーバレベルやシステムレベルの外部にある環境変数でオーバーライドすることができます。


&nbsp;
#### 環境変数の種類

[:mag:](https://laravel.com/docs/8.x/configuration#environment-variable-types) `.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  |



スペースが含まれた値を環境変数として定義したい場合は、値をダブルクォーテーションで囲ってください。



```bash
APP_NAME="My Application"
```


&nbsp;
#### 環境変数の取得

 このファイルに記載された全ての変数は、アプリケーションがリクエストを受け取ったときに、PHPのスーパーグローバル変数である`$_ENV`に読み込まれます。ただし、設定ファイル内の変数を取得するには、`env`というヘルパー関数を使用します。実際にLaravelの設定ファイルを見てみると、いくつかのオプションでこのヘルパー関数が使用されているのが分かります。



```php
'debug' => env('APP_DEBUG', false),
```



`env`関数に渡されている第二引数はデフォルト値です。与えられたキーに対応する環境変数が存在しなかった場合、この値が使用されます。


&nbsp;
#### 現在の環境を把握する

[:mag:](https://laravel.com/docs/8.x/configuration#determining-the-current-environment) アプリケーションの現在の環境は、`.env`ファイルの`APP_ENV`変数で決定されます。この値にアクセスするには、`App`[ファサード](https://readouble.com/laravel/8.x/ja/facades.html)の`environment`メソッドを使用します。



```php
$environment = App::environment();
```



また、現在の環境が指定された値であるかどうかを確かめるために、`environment`メソッドに引数を渡すこともできます。現在の環境が指定された値のいずれかに当てはまる場合、このメソッドは`true`を返します。



```php
if (App::environment('local')) {
    // 環境がlocalである
}

if (App::environment(['local', 'staging'])) {
    // 環境がlocalかstagingのいずれかである
}
```



> アプリケーションの環境は、サーバレベルの環境変数`APP_ENV`で上書きできます。これを応用すると、別々の環境でアプリケーションを共有できます。


&nbsp;
#### デバッグページから環境変数を秘匿する

[:mag:](https://laravel.com/docs/8.x/configuration#hiding-environment-variables-from-debug) 例外がキャッチされず、かつ環境変数`APP_DEBUG`が`true`の場合、デバッグページに全ての環境変数とその内容が表示されます。設定ファイル`config/app.php`内の`debug_hide`オプションを使用すると、特定の変数を隠すことができます。

いくつかの変数は、環境変数とサーバ/リクエストデータの両方で使用されます。そのため、`$_ENV`と`$_SERVER`の両方に指定しなければいけない場合もあります。



```php
return [

    // ...

    'debug_hide' => [
        '_ENV' => [
            'APP_KEY',
            'DB_PASSWORD',
        ],

        '_SERVER' => [
            'APP_KEY',
            'DB_PASSWORD',
        ],

        '_POST' => [
            'password',
        ],
    ],
];
```


&nbsp;
### 設定値へのアクセス

[:mag:](https://laravel.com/docs/8.x/configuration#accessing-configuration-values) グローバルヘルパー関数の`config`を使用することで、アプリケーションのどこからでも設定値にアクセスすることができます。設定値にアクセスするには、アクセスしたいファイル名とオプション名を含んだドット記法を使用します。デフォルト値を指定することもでき、設定オプションが存在しなかった場合に返される値を指定できます。



```php
$value = config('app.timezone');

// 設定値が存在しない場合、デフォルト値が使用される
$value = config('app.timezone', 'Asia/Seoul');
```



実行時に設定値をセットする場合、ヘルパー関数`config`に配列を渡します。



```php
config(['app.timezone' => 'America/Chicago']);
```



> **和訳者メモ**
>
> ３通りの方法で環境の値が取得できるということになります。
>
> ```php
> >>> config('app.env')
> => "local"
> >>> App::environment()
> => "local"
> >>> env('APP_ENV')
> => "local"
> ```




&nbsp;
### 設定のキャッシュ

[:mag:](https://laravel.com/docs/8.x/configuration#configuration-caching) アプリケーションの速度を上げるためには、Artisanコマンドの`config:cache`を使用して、全ての設定ファイルを一つのファイルにキャッシュする必要があります。これにより、アプリケーションの全ての設定オプションは一つのファイルにまとめられ、フレームワークが素早く読み込めるようになります。

通常、本番環境へのデプロイのルーティンとして`php artisan config:cache`コマンドは実行するべきです。アプリケーションの開発中は、頻繁に設定オプションを変更するので、このコマンドを実行するべきではありません。



> **注意**
>
> デプロイ処理中に`config:cache`コマンドを実行する場合、設定ファイル内からのみ`env`関数が呼び出されていることを確認してください。設定がキャッシュされると、`.env`ファイルは読み込まれず、`env`関数は`null`を返すようになります。


&nbsp;
### メンテナンスモード

[:mag:](https://laravel.com/docs/8.x/configuration#maintenance-mode) アプリケーションをメンテナンスモードにすると、アプリケーションへの全てのリクエストに対して、カスタムビューが表示されます。これによって、アップデート中やメンテナンス中にアプリケーションを簡単に「無効化」させることができます。メンテナンスモードのチェックは、アプリケーションの標準ミドルウェア内で行われています。アプリケーションがメンテナンスモードになると、ステータスコード503の`MaintenanceModeException`が投げられます。

メンテナンスモードを有効にするには、Artisanコマンドの`down`を実行してください。



```sh
php artisan down
```



また、`down`コマンドに`retry`オプションを与えると、HTTPヘッダに`Retry-After`の値としてセットされます。



```sh
php artisan down --retry=60
```


&nbsp;
##### メンテナンスモードの迂回

メンテナンスモード中でも、`secret`オプションを使用して、メンテナンスモードを迂回するためのトークンを指定することができます。



```sh
php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"
```



アプリケーションをメンテナンスモードにした後、このトークンを指定したアプリケーションのURLを開くと、Laravelはブラウザにメンテナンスモードを迂回するためのCookieを発行します。



```sh
https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515
```



この隠されたルートにアクセスすると、アプリケーションのルート`/`にリダイレクトされます。一度ブラウザにCookieが発行されると、メンテナンスモードが無効のときと同じように、アプリケーションをブラウズできます。


&nbsp;
##### メンテナンス画面のプリレンダリング

デプロイ時に`php artisan down`コマンドを利用した場合、Composerの依存関係やその他のインフラコンポーネントが更新されている間、ユーザがアプリケーションにアクセスするとエラーが発生する場合があります。なぜそんなことが起こるかというと、アプリケーションがメンテナンスモードであることを判定し、テンプレートエンジンを使用してメンテナンス画面を描画するためには、Laravelの大部分を起動する必要があるからです。

そのため、リクエストサイクルの最初に返されるメンテナンスモード画面を事前にレンダリングできます。この画面は、アプリケーションの依存関係が読み込まれる前にレンダリングされます。プリレンダリングには、`down`コマンドの`render`オプションで指定したテンプレートが使用されます。



```sh
php artisan down --render="errors::503"
```


&nbsp;
##### メンテナンスモードへのリクエストをリダイレクトする

メンテナンスモードの間、ユーザがアクセスを試みた全てのアプリケーションURLにメンテナンス画面が表示されます。必要に応じて、全てのリクエストを指定したURLにリダイレクトできます。これには、`redirect`オプションを使用します。全てのリクエストを`/`というURIにリダイレクトさせる例は以下の通りです。



```sh
php artisan down --redirect=/
```


&nbsp;
##### メンテナンスモードを終了する

メンテナンスモードを終了するには、`up`コマンドを使用します。



```sh
php artisan up
```



> **ヒント**
>
> メンテナンスモードのテンプレートは、`resources/views/errors/503.blade.php`に独自のテンプレートを定義することでカスタマイズできます。


&nbsp;
##### メンテナンスモードとキュー

アプリケーションがメンテナンスモードの間、[キュージョブ](https://readouble.com/laravel/8.x/ja/queues.html)は処理されません。アプリケーションがメンテナンスモードから抜けると、ジョブは通常どおり処理されます。


&nbsp;
##### メンテナンスモードの代替案

メンテナンスモードを使用すると、アプリケーションに数秒のダウンタイムが発生するので、Laravelでダウンタイムの無いデプロイを実現したい場合は、[Envoyer](https://envoyer.io/)のような代替案を検討してください。 


&nbsp;
## ディレクトリ構造



### はじめに

[:mag:](https://laravel.com/docs/8.x/structure#introduction) デフォルトのLaravelのアプリケーション構造は、大規模なアプリケーションから小規模なアプリケーションまで、優れたスタートポイントを提供することを目的としています。しかし、アプリケーションを好きなように構成することもできます。Laravelは、Composerがクラスをオートロードできる限り、クラスの配置にほとんど制限を設けていません。


&nbsp;
### ルートディレクトリ



#### appディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-root-app-directory) `app`ディレクトリには、アプリケーションのコアとなるコードが含まれています。このディレクトリに関しては後でもう少し掘り下げて説明しますが、アプリケーションのクラスのほとんどは、このディレクトリの中にあります。


&nbsp;
#### bootstrapディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-bootstrap-directory) `bootstrap`ディレクトリには、フレームワークを起動する`app.php`ファイルが含まれています。また、`cache`ディレクトリも含まれており、パフォーマンスの最適化のためにフレームワークが生成したrouteやservicesのキャッシュファイルなどが含まれています。


&nbsp;
#### configディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-config-directory) `config`ディレクトリには、アプリケーションの設定ファイルが全て含まれています。全てのファイルに目を通し、利用可能なオプションを理解することをおすすめします。


&nbsp;
#### databaseディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-database-directory) `database`ディレクトリには、データベースのマイグレーション、モデルファクトリー、シードが含まれています。必要に応じて、このディレクトリにSQLiteデータベースを保持することもできます。


&nbsp;
#### publicディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-public-directory) `public`ディレクトリには、`index.php`ファイルが含まれています。この`index.php`ファイルは、アプリケーションへの全てのリクエストのエントリーポイントであり、オートロードの構成も行います。また、このディレクトリには、画像、JavaScript、CSSなどのアセットも入っています。


&nbsp;
#### resourcesディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-resources-directory) `resources`ディレクトリには、ビューだけでなく、LESS、SASS、JavaScriptのような、コンパイル前の生のアセットが含まれます。また、このディレクトリには、全ての言語ファイルも入っています。


&nbsp;
#### routesディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-routes-directory) `routes`ディレクトリには、アプリケーションのルート定義が含まれています。デフォルトでは、`web.php`、`api.php`、`console.php`、`channels.php`というルートファイルが入っています。

`web.php`ファイルには、`RouteServiceProvider`が`web`というミドルウェアのグループに配置するルートが含まれており、セッションの状態、[CSRF](https://qiita.com/wanko5296/items/142b5b82485b0196a2da#csrf%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B)の保護、Cookieの暗号化を提供します。アプリケーションがステートレスなRESTful APIを提供しない場合、ルートは全て`web.php`ファイルで定義される可能性が高いです。

`api.php`ファイルには、`RouteServiceProvider`が`api`というミドルウェアのグループに配置するルートが含まれており、レートリミットを提供します。このファイル内で定義されるルートは[ステートレス](https://qiita.com/wind-up-bird/items/b210e294ecb147d67e2b#%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%AC%E3%82%B9)であることを意図しているので、これらのルートを経由してアプリケーションへと入るリクエストはトークンで認証され、セッションの状態(ステート)にアクセスすることはありません。

`console.php`ファイルには、[クロージャ](https://www.php.net/manual/ja/functions.anonymous.php)ベースのコンソールコマンドを定義できます。各クロージャは、コマンドインスタンスにバインドされており、各コマンドのIOメソッドと相互に通信することを可能にします。このファイルには、HTTPのルートではなく、アプリケーションへのコンソールベースのエントリーポイント（ルート）が定義されています。

`channels.php`ファイルには、アプリケーションがサポートしている全てのイベントブロードキャストチャネルを登録できます。



> **和訳者メモ**
>
> `console.php`で`inspire`が定義されているので、以下のコマンドを実行すると、英語の格言が表示されます。
>
> ```sh
> php artisan inspire
> ```



:hatched_chick:


&nbsp;
#### storageディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-storage-directory) `storage`ディレクトリには、コンパイルされたBladeテンプレート、ファイルベースのセッション、ファイルキャッシュなど、フレームワークによって生成されたファイルが含まれています。このディレクトリは、`app`、`framework`、`logs`ディレクトリに分けられています。`app`ディレクトリには、アプリケーションが生成したファイルが保存されます。`framework`ディレクトリには、フレームワークが生成したファイルと、キャッシュが保存されます。最後に、`logs`ディレクトリには、アプリケーションのログファイルが格納されます。

`storage/app/public`ディレクトリは、プロフィールアバターのような、一般に公開される必要がある、ユーザが生成したファイルを保存する場所です。このディレクトリを指すシンボリックリンクを`public/storage`に作成してください。このリンクは、`php artisan storage:link`コマンドを使用して作成できます。


&nbsp;
#### testsディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-tests-directory) `tests`ディレクトリには、自動化されたテストが含まれています。Laravelプロジェクトを作成すると、最初から[PHPUnit](https://phpunit.de/)テストの例が用意されています。それぞれのテストクラスには、`Test`という接尾語が付けられている必要があります。テストを実行するには、`phpunit`コマンドか `php vendor/bin/phpunit`コマンドを使用します。


&nbsp;
#### vendorディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-vendor-directory) `vendor`ディレクトリには、[Composer](https://getcomposer.org/)の依存関係が含まれています。


&nbsp;
### Appディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-app-directory) アプリケーションの大部分は、`app`ディレクトリに格納されます。このディレクトリは、デフォルトで`App`下に名前空間があり、[PSR-4標準オートロード](https://www.php-fig.org/psr/psr-4/)を使用してComposerにオートロードされます。

`app`ディレクトリには、`Console`や`Https`、`Providers`などの様々な追加ディレクトリが含まれています。`Console`と`Http`ディレクトリは、アプリケーションのコアにAPIを提供しているものと考えてください。HTTPプロトコルとCLIは、どちらもアプリケーションと通信するための仕組みですが、アプリケーションのロジックを一切含みません。言い換えると、これらはアプリケーションにコマンドを発行する２通りの方法です。`Console`ディレクトリには、全てのArtisanコマンドが格納され、一方の`Http`ディレクトリには、コントローラ、ミドルウェア、およびリクエストが格納されます。

Artisanコマンドの`make`を使用してクラスを生成すると、`app`ディレクトリ内に様々なディレクトリが生成されます。そのため、例えばArtisanコマンドの`make:job`を実行してjobクラスを生成するまで、`app/Jobs`というディレクトリは存在しません。



> **ヒント**
>
> `app`ディレクトリ内のクラスの多くは、コマンドを介してArtisanによって生成することができます。利用可能なコマンドを確認するには、ターミナルで`php artisan list make`を実行してください。


&nbsp;
#### Broadcastingディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-broadcasting-directory) `Broadcasting`ディレクトリには、アプリケーションの全てのブロードキャストチャネルクラスが含まれています。これらのクラスは、`make:channel`コマンドを使用して生成できます。このディレクトリはデフォルトでは存在しませんが、最初にチャネルを作成したときに作成されます。チャネルについての詳細は、[ブロードキャスティング](https://laravel.com/docs/8.x/broadcasting)のドキュメントを参照してください。


&nbsp;
#### Consoleディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-console-directory) `Console`ディレクトリには、アプリケーションの全てのカスタムArtisanコマンドが含まれています。これらのコマンドは、`make:command`コマンドを使用して生成できます。また、このディレクトリには、カスタムArtisanコマンドを[スケジューリングタスク](https://laravel.com/docs/8.x/scheduling)に設定できるコンソールカーネルも入っています。


&nbsp;
#### Eventsディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-events-directory) このディレクトリはデフォルトでは存在しませんが、Artisanコマンドの`event:generate` と `make:event`によって作成されます。`Events`ディレクトリには、[イベントクラス](https://laravel.com/docs/8.x/events)が格納されます。イベントは、与えられたアクションが発生したことをアプリケーションの他の部分を通知するのに使用され、非常に大きな柔軟性と分離性を提供します。


&nbsp;
#### Exceptionディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-exceptions-directory) `Exceptions`ディレクトリには、アプリケーションの例外ハンドラが含まれ、アプリケーションによって投げられた例外を配置するのに適しています。例外をログに記録したり描画する方法を変更する場合は、このディレクトリ内の`Handler`クラスを編集してください。


&nbsp;
#### Httpディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-http-directory) `Http`ディレクトリには、コントローラ、ミドルウェア、フォームリクエストが含まれています。アプリケーションに入るリクエストを処理するほとんどのロジックは、このディレクトリ内にあります。


&nbsp;
#### Jobsディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-jobs-directory) このディレクトリはデフォルトでは存在しませんが、Artisanコマンドの`make:job`を実行すると作成されます。`Jobs`ディレクトリには、アプリケーションのための[キュージョブ](https://readouble.com/laravel/8.x/ja/queues.html)が格納されます。ジョブは、アプリケーションによってキューに入れられるか、現在のリクエストのライフサイクルと同期して実行されます。現在のリクエストに同期して実行されるジョブについては、[コマンドパターン](https://ja.wikipedia.org/wiki/Command_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)の実装であるため、「コマンド」と呼ばれることもあります。


&nbsp;
#### Listenersディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-listeners-directory) このディレクトリはデフォルトでは存在しませんが、Artisanコマンドの`event:generate`か`make:listener`を実行すると作成されます。`Listeners`ディレクトリには、[イベント](https://readouble.com/laravel/8.x/ja/events.html)を処理するクラスが含まれています。イベントリスナはイベントのインスタンスを受け取り、発生したイベントに応じてロジックを実行します。例えば、`UserRegistered`イベントは、`SendWelcomeEmail`リスナによって処理される、という感じです。


&nbsp;
#### Mailディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-mail-directory) このディレクトリはデフォルトでは存在しませんが、Artisanコマンドの`make:mail`を実行すると作成されます。`Mail`ディレクトリには、アプリケーションから送信されるメールを表すクラスが全て含まれています。Mailオブジェクトを使用することで、メールを構築する全てのロジックを1つのシンプルなクラスでカプセル化することができ、`Mail::send`メソッドを用いて送信することができます。


&nbsp;
#### Modelsディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-models-directory) `Models`ディレクトリには、全てのEloquentモデルクラスが含まれています。Laravelに入っているEloquent ORMは、データベースを操作するための美しくシンプルなActiveRecord実装を提供します。各データベーステーブルは対応する「モデル」があり、そのテーブルを操作するために使用できます。モデルを使用すると、テーブルのデータに対してクエリを発行したり、テーブルに新たなレコードを挿入したりできます。


&nbsp;
#### Notificationsディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-notifications-directory) このディレクトリはデフォルトでは存在しませんが、Artisanコマンドの`make:notification`を実行すると作成されます。`Notifications`ディレクトリには、アプリケーション内で発生したイベントに関する通知など、アプリケーションから送信される「トランザクション」の通知が全て含まれています。Laravelの通知機能を使用することで、様々なドライバを介して、メールやSlack、SMSで通知を送信したり、データベースに保存したりすることを抽象化できます。


&nbsp;
#### Policiesディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-policies-directory) このディレクトリはデフォルトでは存在しませんが、Artisanコマンドの`make:policy`を実行すると作成されます。`Policies`ディレクトリには、アプリケーションの認可ポリシークラスが含まれています。ポリシーは、ユーザがリソースに対して特定のアクションを実行できるかどうかを判断するのに使用されます。詳細については、[認可についてのドキュメント](https://readouble.com/laravel/8.x/ja/authorization.html)を参照してください。


&nbsp;
#### Providersディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-providers-directory) `Providers`ディレクトリには、アプリケーションの全ての[サービスプロバイダ](https://readouble.com/laravel/8.x/ja/providers.html)が含まれています。サービスプロバイダは、サービスコンテナ内のサービスをバインドしたり、イベントを登録したり、リクエストに対してアプリケーションを準備するために他のタスクを実行したりすることで、アプリケーションを起動します。

新規作成したLaravelアプリケーションの場合、このディレクトリにはすでにいくつかプロバイダが入っています。必要に応じて、独自のプロバイダをこのディレクトリに追加することができます。


&nbsp;
#### Rulesディレクトリ

[:mag:](https://laravel.com/docs/8.x/structure#the-rules-directory) このディレクトリはデフォルトでは存在しませんが、Artisanコマンドの`make:rule`を実行することで作成されます。`Rules`ディレクトリには、アプリケーションのカスタムバリデーションルールオブジェクトが含まれます。ルールは、複雑なバリデーションロジックをシンプルなオブジェクトへカプセル化するために使用されます。詳細については、[バリデーションについてのドキュメント](https://laravel.com/docs/8.x/validation)を参照してください。


&nbsp;
## Homestead



### はじめに

[:mag:](https://laravel.com/docs/8.x/homestead#introduction) Laravelは、ローカルでの開発を含めたPHP開発体験全体をより楽しくすることに努めてきました。[Vagrant](https://www.vagrantup.com/)を使えば、仮想マシンの管理と[プロビジョニング](https://www.idcf.jp/words/provisioning.html)をシンプルかつ洗練された方法で行えます。

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を無効化する必要があります。


&nbsp;
####含まれているソフトウェア

* 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


&nbsp;
#### オプションのソフトウェア

* 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


&nbsp;
### インストール&セットアップ



#### 最初にすること

[:mag:](https://laravel.com/docs/8.x/homestead#installation-and-setup) Homestead環境を立ち上げる前に、[Vagrant](https://www.vagrantup.com/downloads.html)と合わせて、[VirtualBox 6.x](https://www.virtualbox.org/wiki/Downloads)、[VMWare](https://www.vmware.com/)、[Parallels](https://www.parallels.com/products/desktop/)または、[Hyper-V](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v)をインストールする必要があります。これらのソフトウェアパッケージは、一般的なOSに対応した使いやすいビジュアルインストーラです。

VMwareプロバイダを使用する場合、VMware Fusion / Workstationと[VMware Vagrantプラグイン](https://www.vagrantup.com/vmware)を購入する必要があります。無料ではありませんが、VMwareを使用すると、共有フォルダのパフォーマンスを高速化することができます。

Parallelsプロバイダを使用する場合、[Parallels Vagrantプラグイン](https://github.com/Parallels/vagrant-parallels)をインストールする必要があります。これは無料です。

[Vagrantには制限](https://www.vagrantup.com/docs/hyperv/limitations.html)があるので、Hyper-Vプロバイダは全てのネットワーク設定を無視します。



> **和訳者メモ**
>
> VagrantをHomebrewでインストールするには、以下のコマンドを実行します。
>
> ```sh
> brew cask install vagrant
> ```
>
> 
>
> [Parallels Vagrantプラグイン](https://github.com/Parallels/vagrant-parallels)の概要とインストール方法については以下の日本語記事を参考にしてください。
>
> https://qiita.com/Michinosuke/items/eae539a1880f223d239e
>


&nbsp;
##### Homestead Vagrant Boxのインストール

VirtualBox / VMwareとVagrantをインストールしたら、ターミナルで以下のコマンドを実行して、`laravel/homestead` BoxをVagrantに追加する必要があります。インターネットの通信スピードによりますが、Boxのダウンロードには数分かかります。



```sh
vagrant box add laravel/homestead
```



コマンドの実行に失敗した場合、Vagrantが最新であるか確認してみてください。



> **注意**
>
> Homesteadは、テストのために"alpha" / "beta" Boxを定期的に発行しますが、それが`vagrant box add`コマンドに支障をきたす場合があります。`vagrant box add`の実行で問題が発生した場合は、`vagrant up`コマンドを実行することで、Vagrantが仮想マシンの起動をしようとしたときに、正しいBoxをダウンロードすることができます。


&nbsp;
##### Homesteadのインストール

ホストマシンにレポジトリをクローンして、Homesteadをインストールしてください。Homestead Boxは、全てのLaravelプロジェクトのホストとして機能するため、ホームディレクトリの`Homestead`フォルダ内にレポジトリをクローンすることをおすすめします。



```sh
git clone https://github.com/laravel/homestead.git ~/Homestead
```



`master`ブランチがいつも安定版というわけではないので、タグ付けされたバージョンのHomesteadを確認してください。最新の安定版は、[GitHubのリリースページ](https://github.com/laravel/homestead/releases)で確認できます。

代わりに、常に最新の安定版がリリースされている`release`ブランチにチェックアウトするという方法もあります。



```sh
cd ~/Homestead

git checkout release
```



Homesteadリポジトリをクローンしたら、Homesteadディレクトリで`bash init.sh`コマンドを実行し、`Homestead.yaml`という設定ファイルを生成してください。`Homestead.yaml`ファイルは、Homesteadディレクトリに配置されます。



```sh
// Mac / Linuxの場合
bash init.sh

// Windowsの場合
init.bat
```


&nbsp;
#### Homesteadの設定



##### プロバイダを起動する

[:mag:](https://laravel.com/docs/8.x/homestead#configuring-homestead) `Homestead.yaml`ファイルの`provider`キーには、どのVagrantプロバイダを使用するかを指定します（ `virtualbox`, `vmware_fusion`, `vmware_workstation`, `parallels` もしくは`hyperv`のいずれか）。任意のプロバイダを設定してください。



```yaml
provider: virtualbox
```


&nbsp;
##### 共有フォルダの設定

`Homestead.yaml`ファイルの`folders`プロパティには、Homestead環境と共有したいフォルダを列挙します。これらのフォルダに含まれるファイルが変更されると、ローカルマシンとHomestead環境の間で同期されます。共有フォルダは、必要な数だけ設定できます。



```yaml
folders:
    - map: ~/code/project1
      to: /home/vagrant/project1
```



> Windowsをご利用の方は、`~/`のようなパスの書き方はせず、代わりに`C:\Users\user\Code\project1`のようなプロジェクトへのフルパスを使用してください。



全てを`~/code`フォルダにマッピングするのではなく、個々のプロジェクトは独自のフォルダにマッピングするようにしてください。フォルダをマッピングしたとき、仮想マシンはフォルダ内の全てのファイルの全てのディスクIOを追跡します。すると、フォルダ内に多数のファイルがあるとき、パフォーマンスに影響を与えます。



```yaml
folders:
    - map: ~/code/project1
      to: /home/vagrant/project1

    - map: ~/code/project2
      to: /home/vagrant/project2
```



> **注意**
>
> Homesteadを使用して`.`（カレントディレクトリ）をマウントするのは絶対にやめてください。Vagrantがカレントディレクトリを`/vagrant`にマッピングせず、オプションの機能が壊れたり、プロビジョニング中に予期せぬ事態が起きることがあります。



[NFS](https://www.vagrantup.com/docs/synced-folders/nfs.html)を有効化するには、同期フォルダの設定にフラグを追加してください。



```yaml
folders:
    - map: ~/code/project1
      to: /home/vagrant/project1
      type: "nfs"
```



> WindowsでNFSを使用する場合は、[vagrant-winnfsd](https://github.com/winnfsd/vagrant-winnfsd)プラグインのインストールを検討してください。このプラグインを使用すると、Homestead Box内のファイルとディレクトリに適切なユーザ/グループ権限を与えることができます。



また、`options`キーに列挙することで、Vagrantの[Synced Folders](https://www.vagrantup.com/docs/synced-folders/basic_usage.html)がサポートするオプションを渡すこともできます。



```yaml
folders:
    - map: ~/code/project1
      to: /home/vagrant/project1
      type: "rsync"
      options:
          rsync__args: ["--verbose", "--archive", "--delete", "-zz"]
          rsync__exclude: ["node_modules"]
```


&nbsp;
##### Nginxサイトの設定

Nginxについて詳しく知らなくても問題ありません。`sites`プロパティを使えば、簡単に「ドメイン」とHomestead環境のフォルダをマッピングできます。サイト設定の例は、`Homestead.yaml`ファイルに含まれています。これにおいても、必要なだけサイトをHomesteadに追加することができます。Homesteadは、作業を行う全てのLaravelプロジェクトに、便利で視認性の高い環境を提供します。



```yaml
sites:
    - map: homestead.test
      to: /home/vagrant/project1/public
```



Homestead Boxをプロビジョニングした後に`sites`プロパティを変更した場合、仮想マシン上のNginx設定を更新するために、もう一度`vagrant reload --provision`コマンドを実行する必要があります。



> Homesteadのスクリプトは、可能な限り問題が発生しないように設計されています。それでもプロビジョニング中に問題が発生した場合は、`vagrant destroy && vagrant up`コマンドを使用して、マシンの破棄と再構築を行ってください。


&nbsp;
##### サービスの有効化 / 無効化

Homesteadはデフォルトでいくつかサービスを起動します。しかし、プロビジョニングの間、どのサービスを有効化し、どのサービスを無効化するのかをカスタマイズすることができます。以下の例では、PostgresSQLを有効化し、MySQLを無効化しています。



```yaml
services:
    - enabled:
        - "postgresql@12-main"
    - disabled:
        - "mysql"
```



指定したサービスは、`enabled`と`disabled`ディレクティブに基づいて、起動または停止が行われます。


&nbsp;
##### ホスト名の解決

Homesteadは、自動的にホスト名を解決できるように、`mDNS`を使用してホスト名を公開します。`Homestead.yaml`に`hostname: homestead`をセットすると、`homestead.local`でホストを利用できるようになります。macOS、iOS、Linuxデスクトップディストリビューションは、`mDNS`をデフォルトでサポートしていますが、Windowsの場合は、[Bonjour Print Services for Windows](https://support.apple.com/kb/DL999?viewlocale=en_US&locale=en_US)のインストールが必要になります。

自動で解決されるホスト名が便利なのは、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
```


&nbsp;
#### Vagrant Boxの起動

[:mag:](https://laravel.com/docs/8.x/homestead#launching-the-vagrant-box) `Homestead.yaml`を好きなように編集したら、Homesteadディレクトリで`vagrant up`コマンドを実行します。すると、Vagrantは仮想マシンを起動し、共有フォルダとNginxサイトを自動的に構成します。

仮想マシンを破棄するには、`vagrant destroy --force`コマンドを使用します。


&nbsp;
#### プロジェクト単位のインストール

[:mag:](https://laravel.com/docs/8.x/homestead#per-project-installation) Homesteadをグローバルにインストールし、同じHomestead Boxを全てのプロジェクトで共有するのではなく、管理しているプロジェクトごとにHomesteadインスタンスを構成できます。プロジェクト単位でHomesteadをインストールすると、`Vagrantfile`をプロジェクトに同梱して、別の人がそのプロジェクト上で`vagrant up`できるようになります。

プロジェクトに直接Homesteadをインストールするには、Composerを使用する必要があります。



```sh
composer require laravel/homestead --dev
```



Homesteadをインストールしたら、`make`コマンドで`Vagrantfile`と`Homestead.yaml`ファイルをプロジェクトルートに作成してください。`make`コマンドは、`Homestead.yaml`ファイル内の`sites`と`folders`ディレクティブを自動で設定します。



Mac / Linux :

```sh
php vendor/bin/homestead make
```



Windows :

```powershell
vendor\\bin\\homestead make
```



次に、ターミナルで`vagrant up`コマンドを実行してから、ブラウザで`http://homestead.test`を開いてプロジェクトにアクセスしてください。覚えておいていただきたいのは、自動的な[ホスト名の解決](#ホスト名の解決)を使用していない場合、`homestead.test`または任意のドメインを`/etc/hosts`ファイルに追加する必要があります。


&nbsp;
#### オプション機能のインストール

[:mag:](https://laravel.com/docs/8.x/homestead#installing-optional-features) オプションのソフトウェアは、Homesteadの設定ファイルの「feature」設定を用いてインストールされます。ほとんどの機能は、論理値で有効か無効かを設定しますが、一部の機能では、複数の設定オプションが利用できます。



```yaml
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
```


&nbsp;
##### MariaDB

MariaDBを有効化すると、MySQLは削除され、MariaDBがインストールされます。MariaDBはMySQLの完全な互換なので、アプリケーションデータベースの設定では、`mysql`というデータベースドライバを引き続き使用できます。


&nbsp;
##### MongoDB

デフォルトのMongoDBでは、データベースのユーザ名は`homestead`、対応するパスワードは`secret`に設定されています。


&nbsp;
##### Elasticsearch

Elasticsearchのバージョンは、メジャーバージョンを指定するか、正確なバージョン番号（メジャー.マイナー.パッチ の形式）で指定できます。デフォルトのインストールでは、「homestead」という名前のクラスタを作成します。ElasticsearchにOSのメモリの半分以上を使わせるべきではないので、Homesteadマシンのメモリの過半数をElasticsearchアプリケーションに割り当てないでください。



> 設定をカスタマイズする方法については、[Elasticsearchドキュメント](https://www.elastic.co/guide/en/elasticsearch/reference/current)を参照してください。


&nbsp;
##### Neo4j

デフォルトでインストールしたNeo4jは、データベースのユーザ名に`homestead`が設定され、対応するパスワードは`secret`になっています。Neo4jブラウザにアクセスするには、Webブラウザで`http://homestead.test:7474`を開いてください。Neo4jクライアントのために、`7687` (Bolt)、`7474` (HTTP)、`7473` (HTTPS)のポートが用意されています。


&nbsp;
#### エイリアス

[:mag:](https://laravel.com/docs/8.x/homestead#aliases) Homesteadディレクトリの`aliases`ファイルを編集して、HomesteadマシンへのBashエイリアスを追加しましょう。



```bash
alias c='clear'
alias ..='cd ..'
```



`aliases`ファイルをアップデートしたら、`vagrant reload --provision`コマンドでHomesteadマシンを再度プロビジョニングする必要があります。これによって、新しいエイリアスがマシン上で利用できるようになります。


&nbsp;
### よくある使い方



#### Homesteadへのグローバルアクセス

[:mag:](https://laravel.com/docs/8.x/homestead#accessing-homestead-globally) ファイルシステムのどこからでも `vagrant up`コマンドでHomesteadマシンを起動したいと思うかもしれません。Mac / Linuxをご利用の場合は、Bash関数をBash profileに追加することで実現できます。Windowsをご利用の場合は、`PATH`にバッチファイルを追加することで同様に実現可能です。これらのスクリプトは、システムのどこからでもVagrantコマンドを実行できるようにし、そのコマンドを自動でHomesteadのインストール先に渡してくれます。


&nbsp;
##### Mac / Linux

```bash
function homestead() {
    ( cd ~/Homestead && vagrant $* )
}
```



関数内の`~/Homestead`パスは、実際にHomesteadがインストールされている場所に合わせて書き換えてください。関数をインストールしたら、システムのどこからでも`homestead up` や`homestead ssh`のようにコマンドを実行できます。



> **和訳者メモ**
>
> macOS「Catalina」では、デフォルトシェルが**bash**から**zsh**に変更されているのでご注意ください。特にこだわりがなければ、bashをご利用の場合は`~/.bash_profile`に、zshをご利用の場合は`~/.zprofile`に上述のスクリプトを書き込んでください。


&nbsp;
##### Windows

どこにでもいいので`homestead.bat`というバッチファイルを作成し、以下の内容を書き込んでください。



```powershell
@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`のようなコマンドが実行できるようになります。


&nbsp;
#### SSHを用いた接続

[:mag:](https://laravel.com/docs/8.x/homestead#connecting-via-ssh) Homesteadディレクトリで`vagrant ssh`コマンドを実行すると、SSHで仮想マシンにアクセスできます。

ただし、HomesteadマシンへのSSHアクセスは頻繁に利用するので、前の項でご紹介した関数を追加した方が、Homestead Boxに素早くSSHでアクセスできておすすめです。


&nbsp;
#### データベースへの接続

[:mag:](https://laravel.com/docs/8.x/homestead#connecting-to-databases) `homestead`のデータベースでは、MySQLとPostgreSQLが最初から使えるようになっています。ホストマシンのデータベースクライアントからMySQLかPostgreSQLデータベースにアクセスするには、`127.0.0.1`の`33060`番ポート（MySQL）または`54320`番ポート（PostgreSQL）に接続してください。どちらのデータベースでも、ユーザ名とパスワードは、`homestead` / `secret`です。



> ホストマシンからデータベースに接続するときには、このように一般的ではないポートのみを使用してください。Laravelは仮想マシン内で動いているので、標準的な3306と5432ポートをLaravelのデータベース設定に使用します。



> **和訳者メモ**
>
> 私の環境では、ホストマシンからHomesteadのMySQLに接続しようとすると、以下のようなエラーが発生しました。
>
> ```sh
> $ 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を起動し、解決しました。
>
> ```sh
> $ brew services stop mysql
> $ homestead reload --provision
> $ mysql -h 127.0.0.1 -P 33060 -u homestead -psecret
> mysql>
> ```
>
> 


&nbsp;
#### データベースのバックアップ

[:mag:](https://laravel.com/docs/8.x/homestead#database-backups) Homesteadには、Vagrant Boxが破棄されたときに、自動的にデータベースのバックアップを作成する機能があります。この機能を利用するには、Vagrantのバージョン2.1.0以上を使用している必要があります。古いバージョンのVagrantを使用している場合には、`vagrant-triggers`というプラグインをインストールしてください。`Homestead.yaml`ファイルに以下の行を追加することで、データベースの自動バックアップを有効化できます。



```yaml
backup: true
```



設定した後、`vagrant destroy`コマンドを実行すると、Homesteadは、データベースを`mysql_backup`と`postgres_backup`ディレクトリに出力します。これらのディレクトリは、クローンしたHomesteadディレクトリにありますが、[プロジェクト単位のインストール](https://laravel.com/docs/8.x/homestead#per-project-installation)を使用した場合は、プロジェクトのルートディレクトリにあります。


&nbsp;
#### データベースのスナップショット

[:mag:](https://laravel.com/docs/8.x/homestead#database-snapshots) Homesteadでは、[MySQLロジカルマネージャ](https://github.com/Lullabot/lmm)を利用することで、MySQLとMariaDBの状態の凍結とブランチが可能です。例えば、数ギガバイトのデータベースを持つサイトで作業していても、データベースをインポートして、[スナップショット](https://www.idcf.jp/words/snapshot.html)をとることができます。それから必要な作業をして、ローカルにテストコンテンツを作成した後、すぐに元の状態に戻せます。

内部では、[コピーオンライト](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%94%E3%83%BC%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%88)をサポートした[LVM](https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3)の薄いスナップショット機能を[LMM](https://github.com/Lullabot/lmm)が利用しています。つまり、テーブルの一つの行を書き換えるということは、書き込んだ変更がただディスクに移されるというだけなので、大幅に時間を短縮し、リストア中のディスク容量を節約できます。

`lmm`コマンドはLVMの操作に使用するので、`root`で実行する必要があります。実行可能な全てのコマンドを確認するには、Vagrant Box内で`sudo lmm`コマンドを実行してください。一般的な流れは、以下のようになります。



1. デフォルトのlmmの`master`ブランチにデータベースをインポートする。
2. `sudo lmm branch prod-YYYY-MM-DD`コマンドを使用して、変更前のデータベースのスナップショットを保存する。
3. データベースを編集する。
4. `sudo lmm merge prod-YYYY-MM-DD`コマンドを実行して、全ての変更をなかったことにする。
5. `sudo lmm delete <branch>`コマンドを実行して、必要なくなったブランチを削除する。


&nbsp;
#### サイトの追加

 Homestead環境をプロビジョニングして実行したあとに、Laravelアプリケーションに新しいNginxサイトを追加したいことがあります。一つのHomestead環境で、何個でもLaravelは実行できます。サイトを追加するには、`Homestead.yaml`ファイルにサイトを追加してください。



```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`コマンドを実行してください。


&nbsp;
##### サイトの種類

Homesteadでは、Laravelベースではないプロジェクトを簡単に実行できるようにするため、数種類のサイトがサポートされています。例えば、`symfony2`というサイトタイプを使用すると、SymfonyアプリケーションをHomesteadに簡単に追加できます。



```yaml
sites:
    - map: symfony2.test
      to: /home/vagrant/my-symfony-project/web
      type: "symfony2"
```



利用可能なサイトのタイプは次の通りです：`apache`, `apigility`, `expressive`, `laravel` (デフォルト), `proxy`, `silverstripe`, `statamic`, `symfony2`, `symfony4`,  `zf`


&nbsp;
##### サイトパラメータ

`params`というサイトディレクティブを使用して、Nginxの[fastcgi_param](https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_param)値をサイトに追加できます。例えば、以下では`BAR`という値を持った`FOO`パラメータを追加しています。



```yaml
sites:
    - map: homestead.test
      to: /home/vagrant/project1/public
      params:
          - key: FOO
            value: BAR
```


&nbsp;
#### 環境変数

[:mag:](https://laravel.com/docs/8.x/homestead#environment-variables) `Homestead.yaml`に書き加えることで、グローバル環境変数を設定できます。



```yaml
variables:
    - key: APP_ENV
      value: local
    - key: FOO
      value: bar
```



`Homestead.yaml`を編集したら、必ず`vagrant reload --provision`コマンドを実行して、再度マシンをプロビジョニングしてください。インストールしている全PHPバージョンのPHP-FPMの設定がアップデートされ、`vagrant`ユーザの環境もアップデートされます。


&nbsp;
#### ワイルドカードSSL

 Homesteadでは、`Homestead.yaml`ファイルの`sites:`セクションに定義したサイトそれぞれに、自己署名付きのSSL証明書が設定されます。サイトのワイルドカードSSL証明書を生成したい場合は、サイト設定に`wildcard`オプションを追加してください。サイトは、特定ドメインの証明書ではなく、ワイルドカード証明書を使用するようになります。



```yaml
- map: foo.domain.test
  to: /home/vagrant/domain
  wildcard: "yes"
```



`use_wildcard`オプションが`no`になっている場合、ワイルドカード証明書は生成されますが、使用されません。



```yaml
- map: foo.domain.test
  to: /home/vagrant/domain
  wildcard: "yes"
  use_wildcard: "no"
```


&nbsp;
#### Cronスケジュールの設定

[:mag:](https://laravel.com/docs/8.x/homestead#configuring-cron-schedules) Laravelでは、[Cronジョブのスケジュール](https://laravel.com/docs/8.x/scheduling)を簡単に使えるようにするため、Artisanコマンドの`schedule:run`を１分ごとに実行するようスケジューリングされています。`schedule:run`コマンドは、`App\Console\Kernel`にジョブスケジュールが設定されているかどうかによって、ジョブを実行するか判断します。

サイトに対して`schedule:run`コマンドを実行したい場合は、サイト設定の`schedule`オプションに`true`を設定してください。



```yaml
sites:
    - map: homestead.test
      to: /home/vagrant/project1/public
      schedule: true
```



サイトのCronジョブは、仮想マシンの`/etc/cron.d`フォルダ内に定義されます。


&nbsp;
#### Mailhogの設定

[:mag:](https://laravel.com/docs/8.x/homestead#configuring-mailhog) Mailhogを使用すると、実際にメールを受信者に送信しなくても、メールを取得できるようになります。使用するにあたって、`.env`ファイルのメール設定を以下のように書き換えてください。



```sh
MAIL_MAILER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
```



Mailhogの設定が終わったら、`http://localhost:8025`を開いて、Mailhogダッシュボードにアクセスできます。


&nbsp;
#### Minioの設定

[:mag:](https://laravel.com/docs/8.x/homestead#configuring-minio) Minioは、Amazon S3と互換性のあるAPIを備えた、オープンソースのオブジェクトストレージサーバです。Minioをインストールするには、`Homestead.yaml`の[features](https://laravel.com/docs/8.x/homestead#installing-optional-features)セクションに以下の設定オプションを書き加えてください。



```yaml
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`に変更してください。



```php
'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`に以下のオプションが含まれていることを確認してください。



```sh
AWS_ACCESS_KEY_ID=homestead
AWS_SECRET_ACCESS_KEY=secretkey
AWS_DEFAULT_REGION=us-east-1
AWS_URL=http://localhost:9600
```



[バケット](https://blog.ipswitch.com/jp/understanding-how-aws-s3-buckets-work)をプロビジョニングするには、Homesteadの設定ファイルに`buckets`ディレクティブを追加してください。



```yaml
buckets:
    - name: your-bucket
      policy: public
    - name: your-private-bucket
      policy: none
```



`policy`の値には、`none`, `download`, `upload`, `public`が使用できます。


&nbsp;
#### ポート

[:mag:](https://laravel.com/docs/8.x/homestead#ports) デフォルトでは、以下のポートがHomestead環境に転送（[ポートフォワーディング](https://www.idcf.jp/words/port-forwarding.html)）されます。



* **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 に転送


&nbsp;
##### ポートフォワーディングの追加

必要なら、特定のプロトコル以外にも、追加のポートフォワーディングをVagrant Boxに設定できます。



```yaml
ports:
    - send: 50000
      to: 5000
    - send: 7777
      to: 777
      protocol: udp
```


&nbsp;
#### 環境の共有

[:mag:](https://laravel.com/docs/8.x/homestead#sharing-your-environment) 今やっていることを同僚やクライアントと共有したい場合があると思います。Vagrantの`vagrant share`コマンドを使用すれば、これが可能になります。ただし、`Homestead.yaml`ファイルで複数のサイトを構成している場合には、使用できません。

この問題を解決するために、Homestead自体にも`share`コマンドが搭載されています。これを使用するには、`vagrant ssh`コマンドでHomesteadマシンにSSH接続したあと、`share homestead.test`コマンドを実行します。すると、設定ファイルの`Homestead.yaml`から`homestead.test`というサイトが共有されます。他に構築しているサイトがあれば、`homestead.test`の代わりに使用できます。



```sh
share homestead.test
```



コマンドを実行すると、Ngrokの画面が表示され、そこにはアクティビティログと、共有したサイトの公開URLが含まれています。任意のリージョンやサブドメインなど、Ngrokのランタイムオプションを指定したい場合は、`share`コマンドにそれらを付け加えることで実現可能です。



```sh
share homestead.test -region=eu -subdomain=laravel
```



> **注意**
>
> 忘れないで欲しいのは、Vagrantは本質的に安全ではなく、`share`コマンドを実行すれば、仮想マシンがインターネット上に晒されてしまうということです。


&nbsp;
#### 複数のPHPバージョン

[:mag:](https://laravel.com/docs/8.x/homestead#multiple-php-versions) Homestead 6から、同じ仮想マシン上で複数のバージョンのPHPがサポートされるようになりました。`Homestead.yaml`ファイルで、サイトに使用するPHPバージョンを指定できます。利用可能なPHPバージョンは、"5.6", "7.0", "7.1", "7.2", "7.3", "7.4" (デフォルト)です。



```yaml
sites:
    - map: homestead.test
      to: /home/vagrant/project1/public
      php: "7.1"
```



さらに、コマンドライン上では、サポートされているPHPバージョンを全て利用できます。



```sh
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バージョンを変更できます。



```sh
php56
php70
php71
php72
php73
php74
```




&nbsp;
#### Webサーバ

[:mag:](https://laravel.com/docs/8.x/homestead#web-servers) Homesteadでは、デフォルトでWebサーバにNginxを使用します。ただし、サイトタイプに`apache`を指定すれば、Apacheをインストールすることもできます。両方のWebサーバを同時にインストールすることはできますが、同時に動かすことはできません。`flip`というシェルコマンドを使用すれば、Webサーバを簡単に切り替えられます。`flip`コマンドは、起動しているWebサーバがどちらであるかを自動的に判別して停止し、もう片方のサーバを起動します。このコマンドを使用するには、HomesteadマシンにSSHで接続し、ターミナルで以下のコマンドを実行してください。



```sh
flip
```


&nbsp;
#### メール

[:mag:](https://laravel.com/docs/8.x/homestead#mail) Homesteadには、Postfixというメール転送エージェントが含まれており、デフォルトで`1025`番ポートを使用しています。なので、`localhost`の`1025`番ポートで`smtp`のメールドライバを使用するように設定してください。そして、送信されたメールは全て、Postfixによって処理され、Mailhogによって取得されます。送信したメールを確認するには、ブラウザで[http://localhost:8025](http://localhost:8025/)にアクセスしてください。


&nbsp;
### デバッグ&分析



#### Xdebugを用いたWebリクエストのデバッグ

[:mag:](https://laravel.com/docs/8.x/homestead#debugging-web-requests) Homesteadでは、[Xdebug](https://xdebug.org/)を使用したステップ実行がサポートされています。例えば、ブラウザでWebページを読み込むと、PHPは[IDE](https://ja.wikipedia.org/wiki/%E7%B5%B1%E5%90%88%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83)に接続して、動いているコードの検査や修正を可能にします。

Xdebugはデフォルトで既に起動していて、いつでも接続できます。コマンドラインでXdebugを有効化する必要がある場合は、Vagrant Box内で`sudo phpenmod xdebug`コマンドを実行してください。次は、IDEの指示に従って、デバッグを有効化してください。最後に、[ブックマークレット](https://www.jetbrains.com/phpstorm/marklets/)や拡張を使用して、Xdebugを起動するようにブラウザを設定してください。



> **注意**
>
> Xdebugを使用すると、PHPの動作は著しく遅くなります。Xdebugを無効にするには、Vagrant Box内で`sudo phpdismod xdebug`コマンドを実行し、FPMサービスを再起動してください。


&nbsp;
#### CLIアプリケーションのデバッグ

[:mag:](https://laravel.com/docs/8.x/homestead#debugging-cli-applications) PHPのCLIアプリケーションをデバッグするには、Vagrant Box内で`xphp`というシェルエイリアスを使用します。



```sh
xphp path/to/script
```


&nbsp;
##### Xdegugの自動起動

Webサーバのリクエストを作成する機能テストをデバッグする場合、デバッグするためにカスタムヘッダやCookieを使用するように変更するより、自動起動のデバッグを使用した方が簡単です。Xdebugを自動起動にする方法は、Vagrant Box内の`/etc/php/7.x/fpm/conf.d/20-xdebug.ini`を編集し、以下の設定を追記してください。



```ini
; ここに記述すべきIPアドレスは、Homestead.yamlに記載されているIPアドレスです。
xdebug.remote_host = 192.168.10.1
xdebug.remote_autostart = 1
```


&nbsp;
#### Blackfireを用いたアプリケーションの分析

[:mag:](https://laravel.com/docs/8.x/homestead#profiling-applications-with-blackfire) [Blackfire](https://blackfire.io/docs/introduction)は、WebリクエストとCLIアプリケーションを分析し、パフォーマンスアサーションの記述ができるSaaSサービスです。分析データをコールグラフとタイムラインで表示する、インタラクティブなユーザーインターフェースを提供します。開発環境でも、ステージングでも、本番環境でも、エンドユーザに影響を与えずに使用できます。コードと設定ファイル`php.ini`に対して、パフォーマンス、クオリティ、セキュリティのチェックができます。

[Blackfire Player](https://blackfire.io/docs/player/index)は、分析方法を記述するためにBlackfireと共に使用できる、オープンソースのWebクローラ / Webテスト / Webスクレイピングアプリケーションです。

Blackfireを有効化するには、Homesteadの設定ファイル内の「features」設定を使用します。



```yaml
features:
    - blackfire:
        server_id: "server_id"
        server_token: "server_value"
        client_id: "client_id"
        client_token: "client_value"
```



Blackfireサーバの資格情報とクライアントの資格情報には、[ユーザアカウントが必要です](https://blackfire.io/signup)。Blackfireには、アプリケーションを分析するために、コマンドラインツールとブラウザ拡張を含めた様々なオプションがあります。詳細は、[Blackfireのドキュメント](https://blackfire.io/docs/cookbooks/index)をご覧ください。


&nbsp;
##### XHGuiを用いたPHPパフォーマンスの分析

[XHGui](https://www.github.com/perftools/xhgui)は、PHPアプリケーションのパフォーマンスを調査するためのユーザインターフェースです。XHGuiを有効化するには、サイト設定に`xhgui: 'true'`を加えてください。



```yaml
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`を付与してください。



```sh
XHGUI=on path/to/script
```



CLIの分析結果は、Webの分析結果と同じように閲覧できます。

分析を行うと、スクリプトの実行速度が遅くなり、実時間が実際のリクエストの約２倍になることに注意してください。したがって、実際の数字ではなく、常に改善率を比較するようにしてください。また、実行時間には、デバッガ内で一時停止される時間も含まれています。

分析を行うと、ディスクスペースの大部分を消費してしまうので、数日経つと自動的に消去されます。


&nbsp;
### ネットワークインターフェース

[:mag:](https://laravel.com/docs/8.x/homestead#network-interfaces) `Homestead.yaml`の`networks`プロパティは、Homestead環境のネットワークインターフェースを構成します。インターフェースは、必要な数だけ構成できます。



```yaml
networks:
    - type: "private_network"
      ip: "192.168.10.20"
```



[ブリッジ](https://www.vagrantup.com/docs/networking/public_network.html)インターフェースを有効化するには、`bridge`設定を追加し、ネットワークタイプを`public_network`に変更してください。



```yaml
networks:
    - type: "public_network"
      ip: "192.168.10.20"
      bridge: "en1: Wi-Fi (AirPort)"
```



[DHCP](https://www.vagrantup.com/docs/networking/public_network.html)を有効化するには、設定から`ip`オプションを削除してください。



```yaml
networks:
    - type: "public_network"
      bridge: "en1: Wi-Fi (AirPort)"
```


&nbsp;
### Homesteadの拡張

[:mag:](https://laravel.com/docs/8.x/homestead#extending-homestead) Homesteadディレクトリのルートにある`after.sh`を使用すると、Homesteadを拡張できます。このファイルには、仮想マシンの設定やカスタマイズのためのシェルコマンドを記述できます。

Homesteadをカスタマイズするとき、Ubuntuは、パッケージの元の設定を維持するか、新しい設定ファイルで上書きするかを確認する場合があります。これを回避するには、パッケージをインストールする際に以下のコマンドを使用して、Homesteadで以前に書かれた設定を上書きしないようにします。



```sh
sudo apt-get -y \
    -o Dpkg::Options::="--force-confdef" \
    -o Dpkg::Options::="--force-confold" \
    install your-package
```


&nbsp;
##### ユーザカスタマイズ

チーム設定でHomesteadを使用する場合、個人の開発スタイルに合わせるために、Homesteadを微調整できます。Homesteadディレクトリ（`Homestead.yaml`があるのと同じディレクトリ）のルートに、`user-customizations.sh`というファイルを作成してください。このファイル内には、独自のカスタマイズを作成できます。ただし、`user-customizations.sh`はバージョン管理しないでください。


&nbsp;
### Homesteadのアップデート

[:mag:](https://laravel.com/docs/8.x/homestead#updating-homestead) Homesteadをアップデートする前に、Homesteadディレクトリで以下のコマンドを実行し、現在の仮想マシンを削除する必要があります。



```sh
vagrant destroy
```



次に、Homesteadのソースコードをアップデートする必要があります。レポジトリをクローンしている場合、レポジトリをクローンした場所で以下のコマンドを実行してください。



```sh
git fetch

git pull origin release
```



これらのコマンドは、GitHubレポジトリからHomesteadの最新のコードを取得し、latestタグをフェッチしてから、latestタグのついたリリースにチェックアウトしています。最新の安定版のリリースバージョンは、[GitHubリリースページ](https://github.com/laravel/homestead/releases)で確認できます。

プロジェクトの`composer.json`ファイルを介してHomesteadをインストールした場合、`composer.json`ファイルに`"laravel/homestead": "^11"`が含まれていることを確認した上で、依存関係をアップデートしてください。



```sh
composer update
```



それから、`vagrant box update`コマンドを使用して、Vagrant Boxをアップデートします。



```sh
vagrant box update
```



次に、追加の設定ファイルをアップデートするために、Homesteadディレクトリで`bash init.sh`コマンドを実行します。すると、既に存在する`Homestead.yaml`、`after.sh`、`aliases`ファイルを上書きするか尋ねられます。



```sh
// Mac / Linux...
bash init.sh

// Windows...
init.bat
```



最後に、Homestead Boxを再構築して、最新のVagrantをインストールしてください。



```sh
vagrant up
```




&nbsp;
### プロバイダ固有の設定



#### VirtualBox

[:mag:](https://laravel.com/docs/8.x/homestead#provider-specific-settings) デフォルトで、Homesteadは`natdnshostresolver`を`on`に設定しています。これは、ホストOSのDNS設定をHomesteadが使用できるようにするものです。この設定を上書きしたい場合は、`Homestead.yaml`ファイルに以下の行を追加してください。



```yaml
provider: virtualbox
natdnshostresolver: 'off'
```


&nbsp;
##### Windowsでのシンボリックリンク

Windowsマシンでシンボリックリンクがうまく動作しない場合は、以下のブロックを`Vagrantfile`ファイルに書き加える必要があります。



```powershell
config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end
```


&nbsp;
## Valet



### はじめに

[:mag:](https://laravel.com/docs/8.x/valet#introduction) Valetは、Macを使っているミニマリストのためのLaravel開発環境です。Vagrantも`/etc/hosts`ファイルも使いません。公開しているサイトの共有も、ローカルトンネルを使用します。

Valetは、マシンを起動すると、常に[Nginx](https://www.nginx.com/)をバックグラウンドで起動するように設定します。そして、[DnsMasq](https://en.wikipedia.org/wiki/Dnsmasq)を使用すれば、Valetは`*.test`ドメインへの全てのリクエストを、ローカルマシンにインストールしているサイトへプロキシします。

言い換えると、RAM(メモリ)を7MB程度しか使用しない爆速Laravel開発環境です。ValetはVagrantやHomesteadに完全に取って代わる存在にはなりませんが、柔軟性のある基本的な機能が欲しかったり、極端なスピードを求めていたり、RAMが限られているマシンで作業する場合には、素晴らしい代替手段になります。

Valetは最初から以下をサポートしていますが、これ以外が使用できないということではありません。



* [Laravel](https://laravel.com/)
* [Lumen](https://lumen.laravel.com/)
* [Bedrock](https://roots.io/bedrock/)
* [CakePHP 3](https://cakephp.org/)
* [Concrete5](https://www.concrete5.org/)
* [Contao](https://contao.org/en/)
* [Craft](https://craftcms.com/)
* [Drupal](https://www.drupal.org/)
* [ExpressionEngine](https://www.expressionengine.com/)
* [Jigsaw](https://jigsaw.tighten.co/)
* [Joomla](https://www.joomla.org/)
* [Katana](https://github.com/themsaid/katana)
* [Kirby](https://getkirby.com/)
* [Magento](https://magento.com/)
* [OctoberCMS](https://octobercms.com/)
* [Sculpin](https://sculpin.io/)
* [Slim](https://www.slimframework.com/)
* [Statamic](https://statamic.com/)
* Static HTML
* [Symfony](https://symfony.com/)
* [WordPress](https://wordpress.org/)
* [Zend](https://framework.zend.com/)



いずれにしろ、[カスタムドライバ](https://laravel.com/docs/8.x/valet#custom-valet-drivers)を使用すればValetを拡張できます。


&nbsp;
#### ValetかHomesteadか

[:mag:](https://laravel.com/docs/8.x/valet#valet-or-homestead) ご存知の通り、Laravelはローカルの開発環境として[Homestead](https://laravel.com/docs/8.x/homestead)も提供しています。HomesteadとValetは、対象としているユーザと、ローカル開発へのアプローチという点において異なっています。Homesteadは、自動化されたNginx設定が入ったUbuntuの仮想マシン全体を提供します。仮想化されたLinuxの開発環境が欲しい場合や、Windows / Linuxを使用している場合には、Homesteadを使うのは素晴らしい選択肢となります。

ValetはMacしかサポートしておらず、PHPとデータベースサーバをローカルマシン上に直接インストールする必要があります。PHPとデータベースサーバは、[Homebrew](https://brew.sh/)の`brew install php`と`brew install mysql`というコマンドを使用すれば、簡単に入手できます。Valetは、最小限のリソース消費で爆速のローカル開発環境を構築できるので、必要なものはPHP / MySQLだけであり、完全に仮想化された開発環境が必要でない人には最適です。

ValetもHomesteadも、Laravelの開発環境を構築するとても便利なものです。どちらを使うかは、個人的な好みと、チームが必要としているものによるでしょう。


&nbsp;
### インストール

[:mag:](https://laravel.com/docs/8.x/valet#installation) **Valetは、macOSと[Homebrew](https://brew.sh/)を必要とします。Valetをインストールする前に、ApacheやNginxなどの他のプログラムが、ローカルマシンの80番ポートにバインドされていないことを確認してください。**



* [Homebrew](https://brew.sh/)をインストールするか、`brew update`コマンドを使用して最新バージョンにアップデートしてください。

* Homebrewの`brew install php`コマンドでPHP 7.4をインストールしてください。

* [Composer](https://getcomposer.org/)をインストールしてください。

* 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`のようなコマンドを実行する必要はありません。


&nbsp;
##### データベース

データベースが必要な場合、コマンドラインで`brew install mysql@5.7`を実行し、MySQLを試してみてください。MySQLをインストールしたら、`brew services start mysql@5.7`コマンドで起動できます。データベースには`127.0.0.1`で接続でき、ユーザ名は`root`、パスワードは空文字を使用してください。


&nbsp;
##### PHPのバージョン

Valetでは、`valet use php@version`コマンドでPHPバージョンの変更が可能です。指定されたバージョンのPHPがインストールされていない場合、ValetはBrewを使用してインストールを行います。



```sh
valet use php@7.2

valet use php
```



> **注意**
>
> 複数のバージョンのPHPがインストールされている場合でも、Valetでは一度に一つのバージョンしか使用できません。


&nbsp;
##### リセット

Valetのインストールで問題が発生して正しく実行できない場合は、`composer global update`コマンドの後で`valet install`を実行すると、インストールしたものをリセットして、問題を解決できます。まれにValetの「ハードリセット」が必要な場合がありますが、その場合は、`valet uninstall --force`コマンドの後で`valet install`を実行してください。


&nbsp;
#### アップデート

[:mag:](https://laravel.com/docs/8.x/valet#upgrading) Valetをアップデートするには、ターミナルで`composer global update`コマンドを実行します。アップデートしたあと、`valet install`コマンドを実行すると、設定ファイルが更新されます。


&nbsp;
### サイトの配信

[:mag:](https://laravel.com/docs/8.x/valet#serving-sites) Valetのインストールができたら、サイトを配信する準備は整っています。Valetには、`park`と`link`というLaravelのサイトを配信するのに便利な二つのコマンドがあります。


&nbsp;
#### Parkコマンド



* `mkdir ~/Sites`のようなコマンドを実行して、新しいディレクトリをMac上に作成します。次に、`cd ~/Sites`と`valet park`を実行します。すると、Valetがサイトを探すパスとして、カレントディレクトリが登録されます。

* `laravel new blog`コマンドで、このディレクトリに新しいLaravelサイトを作成します。

* ブラウザで`http://blog.test`を開きます。



**[:mag:](https://laravel.com/docs/8.x/valet#the-park-command) これだけです。**これだけで、「park」したディレクトリに作成したLaravelプロジェクトは、`http://folder-name.test`で配信されます。


&nbsp;
#### Linkコマンド

[:mag:](https://laravel.com/docs/8.x/valet#the-link-command) `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`を実行してください。


&nbsp;
#### TLSを用いたサイトの暗号化

[:mag:](https://laravel.com/docs/8.x/valet#securing-sites) デフォルトでは、ValetはHTTPでサイトを配信します。しかし、HTTP/2を使用して暗号化されたTLSでサイトを配信したい場合は、`secure`コマンドを使用してください。例えば、`laravel.test`ドメインでサイトを配信しているときには、以下のコマンドを実行して暗号化できます。



```sh
valet secure laravel
```



暗号化をやめて、HTTPでの配信に戻したい場合、`unsecure`コマンドを使用してください。`secure`コマンドと同じように、このコマンドにも暗号化をやめたいホスト名を指定します。



```sh
valet unsecure laravel
```


&nbsp;
### サイトの共有

[:mag:](https://laravel.com/docs/8.x/valet#sharing-sites) Valetには、ローカルのサイトを全世界に共有するコマンドも含まれていて、モバイルデバイスでのテスト、チームやクライアントとの共有を簡単に行えます。Valetがインストールされていれば、追加のソフトウェアインストールは必要ありません。


&nbsp;
#### Ngrokを用いたサイトの共有

サイトを共有するには、ターミナルでサイトのディレクトリまで移動し、`valet share`コマンドを実行してください。公開URLがクリップボードにコピーされ、ブラウザに直接ペーストしたり、チームと共有することが可能です。

サイトの共有を停止するには、`Control + C`でプロセスを中止してください。



> `valet share --region=eu`のように、shareコマンドには追加のパラメータを渡すこともできます。詳しくは、[ngrokドキュメント](https://ngrok.com/docs)を参照してください。


&nbsp;
#### Exposeを用いたサイトの共有

[Expose](https://beyondco.de/docs/expose)をインストールしている場合、ターミナルでサイトのディレクトリに移動し、`expose`コマンドを実行することで、サイトを共有できます。サポートされているコマンドラインのパラメータについては、Exposeのドキュメントを参照してください。サイトを共有すると、他のデバイスやチームメンバーと共有できるURLが表示されます。

サイトの共有を停止するには、`Control + C`でプロセスを中止してください。


&nbsp;
#### ローカルネットワーク上でのサイト共有

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`コマンドで、設定の変更を適用してください。


&nbsp;
### サイト固有の環境変数

[:mag:](https://laravel.com/docs/8.x/valet#site-specific-environment-variables) 他のフレームワークを使用しているアプリケーションでは、サーバの環境変数に依存している場合がありますが、プロジェクト内で環境変数を設定する手段はありません。Valetを使えば、プロジェクトのルートに`.valet-env.php`ファイルを追加することで、サイト固有の環境変数を設定することが可能です。これらの変数は、`$_SERVER`というグローバル配列に追加されます。



```php
<?php

// foo.test サイトの $_SERVER['key'] に "value" を設定する
return [
    'foo' => [
        'key' => 'value',
    ],
];

// 全てのサイトの $_SERVER['key'] に "value" を設定する
return [
    '*' => [
        'key' => 'value',
    ],
];
```


&nbsp;
### プロキシサービス

[:mag:](https://laravel.com/docs/8.x/valet#proxying-services) Valetのドメインを、ローカルマシン内の他のサービスにプロキシしたい場合があると思います。例えば、Dockerで別のサイトを起動している間に、Valetも起動する必要がある場合です。しかし、ValetとDockerが同時に80番ポートをバインドすることはできません。

これを解決するには、`proxy`コマンドを使用して、プロキシを生成します。以下は、`http://elasticsearch.test`への全てのトラフィックを`http://127.0.0.1:9200`にプロキシする例です。



```sh
valet proxy elasticsearch http://127.0.0.1:9200
```



`unproxy`コマンドを使えば、プロキシを削除できます。



```sh
valet unproxy elasticsearch
```



`proxies`コマンドを使えば、プロキシされている全てのサイト構成を一覧表示できます。



```sh
valet proxies
```


&nbsp;
### カスタムValetドライバ

[:mag:](https://laravel.com/docs/8.x/valet#custom-valet-drivers) 独自のValetドライバを書くことで、ValetがサポートしていないフレームワークやCMSで動いているPHPアプリケーションを配信できます。Valetをインストールすると、`SampleValetDriver.php`ファイルが入った`~/.config/valet/Drivers`ディレクトリが作成されます。このファイルには、カスタムドライバの書き方について説明するための、簡単なドライバが実装されています。ドライバを書くのに必要な実装は、`serves`、 `isStaticFile`、 `frontControllerPath`という３つのメソッドだけです。

これら３つのメソッドは全て、引数として`$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`とします。

それぞれのメソッドのサンプル実装を見てみましょう。


&nbsp;
##### servesメソッド

`serves`メソッドは、ドライバがリクエストを処理すべきならば`true`を返します。そうでない場合は、`false`を返します。なので、このメソッドの内部では、渡された`$sitePath`に動作させようとしている種類のプロジェクトが含まれているかを判定します。

例として、`WordPressValetDriver`を書いているとしましょう。`serves`メソッドは以下のようになります。



```php
/**
 * ドライバをリクエストに適用するかを判定する
 *
 * @param  string  $sitePath
 * @param  string  $siteName
 * @param  string  $uri
 * @return bool
 */
public function serves($sitePath, $siteName, $uri)
{
    return is_dir($sitePath.'/wp-admin');
}
```


&nbsp;
##### isStaticFileメソッド

`isStaticFile`は、リクエストが画像やスタイルシートのような静的なファイルに対してかを判断します。静的なファイルであった場合、静的ファイルのディスク上のフルパスを返します。静的ファイルでなかった場合、メソッドは`false`を返します。



```php
/**
 * リクエストが静的ファイルに対してのものかを判定する
 *
 * @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が`/`ではなかった場合のみです。


&nbsp;
##### frontControllerPathメソッド

`frontControllerPath`メソッドは、アプリケーションのフロントコントローラのフルパスを返します。多くの場合、index.phpかそれに相当するものです。



```php
/**
 * アプリケーションのフロントコントローラのフルパスを取得する
 *
 * @param  string  $sitePath
 * @param  string  $siteName
 * @param  string  $uri
 * @return string
 */
public function frontControllerPath($sitePath, $siteName, $uri)
{
    return $sitePath.'/public/index.php';
}
```


&nbsp;
#### ローカルドライバ

[:mag:](https://laravel.com/docs/8.x/valet#local-drivers) 単一のアプリケーションにカスタムのValetドライバを定義したい場合、アプリケーションのルートディレクトリに`LocalValetDriver.php`を作成してください。カスタムドライバは、ベースとなる`ValetDriver`クラスを継承するか、`LaravelValetDriver`のような既に存在するアプリケーション固有のドライバを継承します。



```php
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';
    }
}
```


&nbsp;
### その他のValetコマンド

[:mag:](https://laravel.com/docs/8.x/valet#other-valet-commands) 

| コマンド          | 説明                                                         |
| :---------------- | :----------------------------------------------------------- |
| `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を全て削除することもできます。 |


&nbsp;
### Valetディレクトリ&ファイル

[:mag:](https://laravel.com/docs/8.x/valet#valet-directories-and-files) 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設定ファイルです。 |


&nbsp;
## デプロイ



### はじめに

[:mag:](https://laravel.com/docs/8.x/deployment#introduction) Laravelアプリケーションを本番環境にデプロイする準備ができたら、アプリケーションを効率的に実行させるために、やるべきことがいくつかあります。この章では、Laravelアプリケーションが適切にデプロイするための重要なポイントを解説します。


&nbsp;
### サーバの設定



#### Nginx

[:mag:](https://laravel.com/docs/8.x/deployment#nginx) Nginxが動いているサーバにアプリケーションをデプロイする場合、Webサーバの設定として、以下の設定ファイルを参考にしてください。ほとんどの場合、サーバの設定に応じてカスタマイズが必要です。サーバの管理にサポートが必要な場合は、[Laravel Forge](https://forge.laravel.com/)のようなサービスの利用を検討してください。



```nginx
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;
    }
}
```


&nbsp;
### 最適化



#### オートローダの最適化

[:mag:](https://laravel.com/docs/8.x/deployment#autoloader-optimization) 本番環境へデプロイするとき、Composerのクラス・オートローダ・マップを最適化することで、Composerは指定されたクラスのファイルを素早く読み込めるようになります。



```sh
composer install --optimize-autoloader --no-dev
```



> **ヒント**
>
> オートローダの最適化に加えて、プロジェクトのソース管理リポジトリに`composer.lock`ファイルを含めるようにしてください。`composer.lock`がある方が、プロジェクトの依存関係をより速くインストールできます。


&nbsp;
#### 設定の読み込みの最適化

[:mag:](https://laravel.com/docs/8.x/deployment#optimizing-configuration-loading) アプリケーションを本番環境にデプロイするとき、デプロイの流れの中でArtisanコマンドの`config:cache`を実行するようにしてください。



```sh
php artisan config:cache
```



このコマンドは、全てのLaravelの設定ファイルを一つのキャッシュファイルにまとめることで、設定値を読み込む時にフレームワークが参照しなければいけないファイル数を大幅に減らします。



> **注意**
>
> デプロイの流れの中で`config:cache`コマンドを実行する場合、設定ファイル内でのみ`env`関数が呼び出されるようにしてください。設定がキャッシュされると、`.env`ファイルは読み込まれなくなり、`env`関数は全ての呼び出しに対して`null`を返します。


&nbsp;
#### ルートの読み込みの最適化

[:mag:](https://laravel.com/docs/8.x/deployment#optimizing-route-loading) 多くのルートを持つ大規模なアプリケーションを構築する場合、デプロイの流れの中でArtisanコマンドの`route:cache`を実行してください。



```sh
php artisan route:cache
```



このコマンドは、全てのルート登録をキャッシュファイル内の単一のメソッド呼び出しに集約させ、何百ものルートを登録した場合のパフォーマンスを向上させます。


&nbsp;
#### ビューの読み込みの最適化

[:mag:](https://laravel.com/docs/8.x/deployment#optimizing-view-loading) 本番環境にアプリをデプロイするとき、デプロイの流れの中でArtisanコマンドの`view:cache`を実行する必要があります。



```sh
php artisan view:cache
```



このコマンドは、全てのBladeビューをプリコンパイルすることで、要求されたときにコンパイルされるのを防ぎ、ビューを返すリクエストのパフォーマンスを向上させます。


&nbsp;
### Forge / Vaporを使ったデプロイ

[:mag:](https://laravel.com/docs/8.x/deployment#deploying-with-forge-or-vapor) 自分でサーバの設定を管理する準備ができていなかったり、強靭なLaravelアプリケーションを実行するのに必要なさまざまなサービスを全て設定することに抵抗がある場合、[Laravel Forge](https://forge.laravel.com/)は素晴らしい代替手段です。

Laravel Forgeは、DigitalOceanやLinodeやAWSなど、さまざまなインフラプロバイダ上でサーバを作成できます。加えて、Forgeは、NginxやMySQL、Redis、Memcached、Beanstalkなど、強靭なLaravelアプリケーションを構築するのに必要な全てのツールのインストールと管理を行います。


&nbsp;
##### Laravel Vapor

完全にサーバレスで、オートスケール開発プラットフォームにチューニングされたLaravelを使用したい場合、[Laravel Vapor](https://vapor.laravel.com/)を参照してください。Laravel Vaporは、AWSを利用した、Laravelのサーバレス開発プラットフォームです。LaravelのインフラをVaporで立ち上げ、サーバレスでシンプルにスケールできます。Laravel Vaporは、Laravelの開発者によって、フレームワークとシームレスに動作するようにチューニングされているので、今までと同じようにLaravelアプリケーションを書くことができます。