# PHPerによるPHPerのための「Laravel8を中心に語り合う」TechCafe
## イベント
https://rakus.connpass.com/event/192297/
## Release Notes
https://laravel.com/docs/8.x/releases
## 機能一覧
全14個の目玉機能のリリース
### 開発関連
#### Laravel Jetstream (担当:藤澤)
旧バージョンで``make:auth``とか``laravel/ui --auth``して作っていたログイン認証のスキャフォールディングの強化最新版。
加えて、``Livewire``と``Inertia.js``の導入によりSPA的なモダンなUI実現が簡単にできるようになった。
[Jetstream公式](https://jetstream.laravel.com/1.x/introduction.html)
- 認証機能として
- 従来のユーザー登録、ログイン、メール認証機能に加え、プロフィールの編集、二要素認証、アカウント削除、APIトークンによる認証…など認証機能が強化。なお、認証まわりは、[Laravel Fortify](https://github.com/laravel/fortify)として独立爆誕し、Jetstreamで使用されている。
- モダンUIの実現
- モダンUIって?
- SPA、ないし特定の画面要素を動的に更新することによりユーザー体験を向上させるもの、としておきます。一般的にはVueやReact、AngularといったJSフレームワークとAjax通信を実装して実現されるが、JetstreamではLaravelの知識をうまく活かして簡単に実現できるようになった。
- LivewireとInertia.js
- 異なるアプローチでモダンUIを実現する2つのライブラリ
- Jetstreamを導入時(またはプロジェクト新規作成時)に選択する
- もちろん、認証以外の機能開発でも使える
- Livewire
- [公式リファレンス](https://laravel-livewire.com/)
- 「VueとかReactとか複雑っすよね」から始まる公式リファレンス
- Laravel+bladeのみで、JavaScriptを一切書かずともモダンUIが実現できてしまう強烈なライブラリ
- トップページの「Ok, let's see some code」に書かれている極めてシンプルなコード例で「インクリメンタルサーチしながらユーザー一覧を動的に表示するページ」が実装できてしまう
- 「COMPONENT FEATURES」で紹介されている機能のうち、個人的に衝撃的なもの
- [ファイルアップロード](https://laravel-livewire.com/docs/2.x/file-uploads)
- [ファイルダウンロード](https://laravel-livewire.com/docs/2.x/file-downloads)
- [ページネーション](https://laravel-livewire.com/docs/2.x/pagination)
- この凄まじさについては、先日[Fukuoka.php](https://www.youtube.com/watch?v=kCRqIEMyVQY)で[@localdisk](https://twitter.com/localdisk)さんが発表されたセッションをご覧になると良いと思います。
- Inertia.js
- Livewireのせいでちょっと影が薄めだがこちらも素敵なライブラリ
- VueRouterなどがあるとはいえ、基本的にVue.jsなどでSPAを実現するには、Ajax通信の制御やルーティングなどを行う必要がありめんどくさい
- Inertia.jsは、バックエンドのフレームワークのルーティングの記述でフロントエンドのAjax通信・ルーティングも一緒にコントロールできるようにしたもの
- Laravelの場合は、Vue.js+Laravelで動く、Inertia.js自体は、ReactやSvelt、Railsにも対応している
#### Models Directory (担当:藤澤)
Eloquentのモデルが格納されるディレクトリがデフォルトで``app/Models``になった。
``artisan``で``make:model``を実行すると、上記ディレクトリに作成される。
今までは``app``直下だったので、デフォルトだと使いづらったのが楽になる。
ちなみに、``Models``ディレクトリを消すと、従来通り``app``配下に作られる。
[リリースノート](https://readouble.com/laravel/8.x/ja/releases.html#models-directory)
[Laravel8.xマニュアル](https://readouble.com/laravel/8.x/ja/eloquent.html)
[Laravel7.xマニュアル](https://readouble.com/laravel/7.x/ja/eloquent.html)
#### Closure Dispatch / Chain catch (担当:加納)
RDBやRedisに対して送信するキューの送信処理について、送信する処理をクロージャで記載した場合も、catchで例外処理を追加できるようになりました。
[リリースノート](https://readouble.com/laravel/8.x/ja/releases.html)
[Laravel8.xマニュアル](https://readouble.com/laravel/8.x/ja/queues.html)
[Laravel7.xマニュアル](https://readouble.com/laravel/7.x/ja/queues.html)
通常、キューの送信は、キューによって呼び出される処理が定義されたJobクラスを作成し、そのクラス自身のdispatch()メソッドを呼び出すことで行いますが、
キューによって呼び出される処理をクロージャとして定義することも可能です。
(わざわざJobクラスをつくるほどでもない簡単な処理をキューとして実行する時用の機能)
v8.xからは、クロージャでキューで実行される処理を定義した場合に、処理に失敗した場合の例外処理(catch)を定義することができるようになりました。
#### Job Batching (担当:加納)
複数のジョブをバッチ処理として実行することができ流ようになりました。
その際、thenやfinaly、catchを指定することで、バッチ処理の完了により、処理を実行できます。
[リリースノート](https://readouble.com/laravel/8.x/ja/releases.html#job-batching)
[Laravel8.xマニュアル](https://readouble.com/laravel/8.x/ja/queues.html#dispatching-batches)
#### Event Listener Improvements (担当:加納)
クロージャベースのイベントリスナーは、クロージャをメソッドに渡すだけで登録できるようになる。
また、キューを追加することができるようになる。
また、キューに入れられたリスナーをカスタマイズできる。
[リリースノート](https://readouble.com/laravel/8.x/ja/releases.html#event-listener-improvements)
[Laravel8.xマニュアル](https://readouble.com/laravel/8.x/ja/events.html#queuable-anonymous-event-listeners)
#### Dynamic Blade Components (担当:加納)
実行前にどのコンポーネントを利用すべきかわからない場合があるが、それを解消することができる。
例えば、以下のように記述し、なんらかの処理にに失敗した場合は`$componentName`に`success`を、失敗した場合は`error`を指定すれば、それぞれのコンポーネントを呼び出してくれる。
```php=
<x-dynamic-component :component="$componentName" class="mt-4" />
```
[リリースノート](https://readouble.com/laravel/8.x/ja/releases.html#dynamic-blade-components)
[Laravel8.xマニュアル](https://readouble.com/laravel/8.x/ja/blade.html)
#### Tailwind Pagination Views (担当:加納)
CSSフレームワークが Tailwind に変更になった。Bootstrap も引き続き利用可能
#### Routing Namespace Updates (担当:加納)
RouteServiceProvider がデフォルトになり、ルーティングの処理の書き方が分かった。
しかし、バージョンアップした人は問題なくこれまでの記法が利用できる($namespase プロパティを持っている場合問題なく自動的なプレフィックスが利用される)
[リリースノート](https://readouble.com/laravel/8.x/ja/releases.html#routing-namespace-updates)
[Laravel8.xマニュアル](https://readouble.com/laravel/7.x/ja/routing.html#basic-routing)
### テスト関連
おすすめ度【★】
#### ★★★ Model Factory Classes (担当:久山)
モデルファクトリを生成してテスト用のデータを簡単に生成することができるようになります。
依存関係のあるテーブルにも自動的にデータを作成することができます。
faker の使い方
https://qiita.com/tosite0345/items/1d47961947a6770053af
モデルファクトリのドキュメント
https://readouble.com/laravel/8.x/ja/database-testing.html#persisting-models
#### ★ Time Testing Helpers (担当:久山)
現在時刻を調整する機能が追加された
テストケース内で利用する時間操作処理
https://readouble.com/laravel/8.x/ja/mocking.html#interacting-with-time
### 運用関連
#### ★★ Migration Squashing (担当:久山)
マイグレーションファイルをスキーマファイルに書き出しできる
書き出したdumpデータは artisan migrate したときに自動的にrestore してくれる。
dump した後に追加された migrate ファイルがある場合は、それの差分だけを実行してくれる
マイグレーションの圧縮
https://readouble.com/laravel/8.x/ja/migrations.html#squashing-migrations
#### ★★ Improved Rate Limiting (担当:久山)
リクエスト数を制限するなどの制御を加えることができるようになります
レート制限機能の紹介
https://tech-blog.rakus.co.jp/entry/20201016/laravel
#### ★Improved Maintenance Mode (担当:久山)
`artisan` コマンドにメンテナンスモードのオプションが追加され、ホワイトリストドメインを指定しなくてもメンテナンスモード以外のページにアクセスできるようになります。
`--secret` オプションを付与することでメンテナンス状態でもアクセス可能にするCookieをセットする
##### ★Pre-Rendering The Maintenance Mode View (担当:久山)
メンテナンスモード中(デプロイを行っている最中など)にWebアクセスが発生すると composer による依存関係解決の際にエラーになっていた。
そこで、メンテナンスモードは特定のエラーページを表示するようにするオプションを追加できるようになった
```shell=
php artisan down --render="errors::503"
```
#### おまけ:Artisan serve Improvements (担当:久山)
.env ファイルが更新されたら ビルドインサーバが再起動する