laravel/jetstreamが気になりすぎたのでLaravel8をフライングゲットしてみた

# はじめに
Laravel8が2020/09/08(日本は9/9になるかな)にリリースされます。開発するときはLTSを選択する保守的な自分にとっては、7.x以降のバージョンにはあまり興味がなかったのですが、今回は[laravel/jetstream](https://github.com/laravel/jetstream)というフロントエンドスタックが導入されたことで気になり始め、リリース日を待たずにインストールして使ってみることにしました。

# 開発版のLaravel8をインストールする
```bash
composer create-project --prefer-dist laravel/laravel laravel8 dev-develop
```

# 起動してみる
```bash
php artisan serve
```

ドーン
![スクリーンショット 2020-09-06 15.24.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/d9e69fc9-6f41-0777-abac-53d6a81a47dd.png)

ちゃんと画面右下に`Build v8.x-dev`て出てますね。

# modelの格納先を確認する
Laravel8では、modelは`app`直下ではなく`app/Models` に格納されます。単純なMVCモデルで開発するとき、いちいち`app/Models`になるよう設定を変更していた身としてはありがたいです。
![スクリーンショット 2020-09-06 15.28.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/0a2214be-f46e-b548-ad1c-df9f4afa7045.png)

# route:cache使ってみる
laravel8では、クロージャーで書かれていても`route:cache`が通るようになったので、試してみます。

```web.php
<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});
```
こういう書き方は、7.xまではcacheできなくて、`route:cache`するとエラーになっていました。しかし、laravel8.xからは。


```php
php artisan route:cache
Route cache cleared!
Routes cached successfully!
```
このように、エラーになることなく実行できます。

# さらに改善されたメンテナンスモード
Laravelでは `artisan down` を実行することでメンテナンスモードに切り替えることができました。ただ、メンテンスモード中も、開発者はテスト等の為にアクセスする必要があり、laravel6.x系リリース時にIPアドレスによるホワイトリスト形式が採用されました。しかしそれも煩雑だということで、8.x系からはCookie方式が採用されたようです。

```php
php artisan down --secret=HOGE
```

普通にアクセスすると503エラー画面に。
![スクリーンショット 2020-09-06 15.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/86e4c132-fab8-1fb6-e2b7-d629426eb59d.png)

`--secret`で指定したディレクトリにアクセスするとトップページにリダイレクトされ、かつ`laravel_maintenance`という名前のCookieが発行されます。例えば、`--secret=HOGE` なら `http://127.0.0.1:8000/HOGE` にアクセスします。

これにより、メンテナンス中でも、メンテナンスモードを回避してサイトにアクセスできます。IPアドレスのホワイトリスト形式より格段に便利ですね。
![スクリーンショット 2020-09-06 16.05.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/45ea934d-5fba-0e40-c647-940b5de286bd.png)

さらに、`artisan down` 時に、`--render`と、`--status`というオプションが指定できるようになりました。何も指定していないと以下のように503エラー画面がレンダリングされ、statusは503で返りますが……。
![スクリーンショット 2020-09-06 16.20.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/ab27b9cd-8f6c-8389-d82b-6b23c44edcd9.png)

例えば、`php artisan down --render="errors::404" --status=200`というように指定することで、404画面をレンダリング、statusは200を返すというようなことが簡単にできるようです。
![スクリーンショット 2020-09-06 16.19.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/b338f982-e645-7812-5ce0-c72fa1572287.png)

もちろん `--render`には、レンダリング可能なbladeテンプレートを自由に指定できるので、例えば、`welcome.blade.php`を読み込むように`php artisan down --render="welcome"`と指定すると……。welcome画面をレンダリングしつつ、statusは503を返すみたいなことができるわけです。
![スクリーンショット 2020-09-06 16.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/dee4e63f-5e4c-2cb1-c6b7-be0accedae93.png)



# laravel/jetstream！
さて、本命のjetstreamを使ってみます。実は調べてみて気づいたのですが、デフォルトではjetstreamは同梱されないようです(下記のcomposer.json参照)。`laravel/installer` を使った場合のみ `laravel new project-name --jet` というように `--jet`オプションを指定することで同梱されるようです。

```composer.json
    "license": "MIT",
    "require": {
        "php": "^7.3",
        "fideloper/proxy": "^4.2",
        "fruitcake/laravel-cors": "^2.0",
        "guzzlehttp/guzzle": "^7.0.1",
        "laravel/framework": "^8.0",
        "laravel/tinker": "^2.0"
    },
    "require-dev": {
        "facade/ignition": "^2.3.6",
        "fzaninotto/faker": "^1.9.1",
        "mockery/mockery": "^1.3.1",
        "nunomaduro/collision": "^5.0",
        "phpunit/phpunit": "^9.3"
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true
    },
```
なので、仕方なくcomposerでインストールしました。ぐぬぬ……。

```
composer require laravel/jetstream
```

installした後はartisanコマンドでセットアップを行います。

```
php artisan jetstream:install [stack]
```
stackには、[Livewire](https://laravel-livewire.com/) か [inertia](https://inertiajs.com/)を指定します。この辺りはプロダクトの要件次第です。SEO必須ならLivewire、特にそういった制約はなく、かつvueやreactなどのメジャーなjsフレームワークに馴染みがあるなら`inertia`が良いでしょう。ちなみに`イナーシャ`と読みます。今回は、`inertia`を選択します。

```
php artisan jetstream:install inertia
npm install && npm run dev
```
これでセットアップは完了しました。しかし、このままだとDBのセットアップができていないので、`http://127.0.0.1:8000/` にアクセスしてもエラーになります。

```php
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `sessions` where `id` = x7v2PAHVtjL9uktGtbuedgx1bP3glsWwgbqFI3ZS limit 1)
```
なので、[vessel](https://vessel.shippingdocker.com/)をサクッと入れてみます。

```
composer require shipping-docker/vessel --dev
php artisan vendor:publish --provider="Vessel\VesselServiceProvider"
bash vessel init
./vessel start
```
その上でmigrateを実行します。

```
./vessel art migrate
```
準備ができたので、`/dashboard` にアクセスすると。
![スクリーンショット 2020-09-06 16.58.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/a6ae803d-9ef8-c14f-917d-3e7514c7bc27.png)

うまくセットアップできたように見えます。早速 `/register` に移動してユーザー登録してみます。
![スクリーンショット 2020-09-06 17.00.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/81a5e8af-5af8-5e0c-4429-a2b77b9523c0.png)

登録が完了すると、ログイン状態になり`/dashboard`にリダイレクトされます。
![スクリーンショット 2020-09-06 17.02.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/c4321537-92bf-b318-e007-de4825616429.png)

ここまでは、従来のログイン／ユーザー登録のスカフォールドと同じ機能群となります。しかし今回からは `/profile`が追加され、非常にモダンなプロフィール画面が追加されていることがわかります。
![profile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/ae798c02-e9bf-5a73-7cbe-59e27b28c2f3.png)

なんと2要素認証の設定が。ここをENABLEにすると2要素認証が利用可能になります。
![スクリーンショット 2020-09-06 17.09.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/df949e11-61b4-da6d-1625-e52853e3a1e9.png)

上記の画面のQRコードをGoogle Authenticatorなどで読み込ませておき、ログインします。ちゃんとコード入力を求められます。
![スクリーンショット 2020-09-06 17.10.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/c7f97014-bf9c-ec70-58b0-2f62c3e20dee.png)

Google Authenticatorで表示される値を入力すると、無事dashboard画面が表示されました。
![スクリーンショット 2020-09-06 17.02.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/de9dcf55-fb4b-4c93-131e-ea3a3f86ba40.png)

加えて、APIトークンを使った認証も最初から提供されているようです。
![スクリーンショット 2020-09-06 17.17.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111432/61119516-601d-f47e-aec8-e52f92835b9c.png)

以上。jetstreamのスカフォールドに注目してみました。他に`--teams` オプションのようなものもあるようですが一旦今までと同じ使い方さえできたら良かったので検証はこれで十分。

また、今回からフロントエンドの技術スタックに [TALL-stack](https://tallstack.dev/)として注目されていたLivewireとtailwindCSSの組み合わせが簡単に導入できるようになったのも大きいです。この辺りは、バックエンド開発にしか馴染みのない人間にとっては特に恩恵が大きいと思いますので、この機会にぜひ色々チャレンジしてみてください。

# さいごに
Laravel8では、プロジェクトを作った直後に自分で行なっていたmodelやrouteの設定変更が不要になったこと、またスカフォールドで提供される機能がよりモダンになり、登録制のサイト開発が簡単になったことが印象的です。他に、ジョブ実行で[エクスポネンシャルバックオフ](https://aws.amazon.com/jp/blogs/architecture/exponential-backoff-and-jitter/)を簡単に実装できたり、Schema Dumpにより開発環境での初期migrateを簡単にできるようになったとも聞いています。このため開発を実践する上での課題に対して、多くのソリューションを提供してくれているのがlaravel8なのかなと。今後新規開発では、LTSの6を使うか8を使うか実に悩ましいところです。

# 参考
[Release Notes](https://laravel.com/docs/8.x/releases)