---
# System prepended metadata

title: みんシスもくもく会 2023/12/19

---

# Laravel 素振り + ドキュメント読み


## 環境構築

PHP の環境を作っていなかったので作る。
PHP + Laravel の特定のバージョンをパッケージングして使えるようにしてくれるツールを Laravel が準オフィシャルに作っていたので使う

> [Laravel Herd](https://herd.laravel.com/)


デフォルトの設定だと php-fpm 8.2 + nginx + Laravel 10.37.3 だった

![image](https://hackmd.io/_uploads/BknnAy1vp.png)
![image](https://hackmd.io/_uploads/HJgM1lkPa.png)

## 素振り

```sh
# スキャフォールディング
laravel new example-app

# 開発サーバ起動
php artisan serve
```

とりあえず動いたので実装を修正しながら色々と試す

## 責務の分割

Laravel のドキュメントを読んで、こういう実装（設計）にしたほうが良いんだろうな、と感じた部分のメモ

### Controller

- ~~モデルに関係の無い認可は Gate に切り出す~~
    - Gate は使わず可能な限りポリシーに寄せる
    - see: [Authorization - Laravel 10.x - The PHP Framework For Web Artisans](https://laravel.com/docs/10.x/authorization#writing-gates)
- モデルに関連する最小限の認可バリデーションを Policy に切り出す
    - スキャフォールディングできる
        - `php artisan make:policy PostPolicy --model=Post`
    - `Policies` ディレクトリにクラスファイルを設置するとオートインジェクションされる
- Request を FormRequest の具象クラスに切り出す
    - **文字列** で文字数や必須項目などのバリデーション規則を記述できる
        - 型が欲しい
    - Policy の実行もここでいいかも
- Response
    - Eloquent モデルを返すのは脆弱性診断に一発で引っ掛かりそう
    - シンプルなレスポンスは Facade で view や json で返す
    - API のレスポンスは JsonResource の具象クラスを作って返す
- いわゆる軽量 DDD とは相性悪そう
    - ActiveRecord (Eloquent) をラップするクラスを作ることになるが Laravel の生産性を妨げる
- コントローラは[シングルアクションコントローラ](https://laravel.com/docs/10.x/controllers#single-action-controllers)にして、コントローラをユースケースクラスとして考えが方がすっきりしそう

## あとで調べる

- 自動注入周りの詳しい規約（このディレクトリに設置する）をすべて確認する
    - どこかに一覧があるのかな？
    - [Service Container - Laravel 10.x - The PHP Framework For Web Artisans](https://laravel.com/docs/10.x/container#automatic-injection)
        - > Alternatively, and importantly, you may type-hint the dependency in the constructor of a class that is resolved by the container, including controllers, event listeners, middleware, **and more.** 
        - and more を知りたいの
- php artisan serve をプロダクションでホストしてもいい？
    - 内部で使われてる php のビルトインサーバがプロダクションレディじゃないっぽい…
    - [PHP: Built-in web server - Manual](https://www.php.net/manual/en/features.commandline.webserver.php)
        - > Warning: This web server is designed to aid application development. It may also be useful for testing purposes or for application demonstrations that are run in controlled environments. It is not intended to be a full-featured web server. It should not be used on a public network.
- n+1 を検出する Rails でいうところの bullet みたいなミドルウェアはある？
    - Laravel Pulse が全部解決してくれそうな雰囲気はある


## その他

- Facade を大量に使うことになりそうだけど、テストとかそれで良いのかな…と思ったけど、Facade にテスト用のメソッドが潤沢にあって草
    - ちゃんとした依存関係を設計するより、テストまで含めて Facade で全部エイヤっと実装したほうが Laravel-way っぽい雰囲気を感じた

