Laravel sailの初期設定についてのメモ　〜誰でも入れるような環境づくり〜


## 背景
業務では一人で開発するわけではないので、どのレベルの人が入っても気持ちよく開発できるように、最初にプロジェクトを始める人は多少の時間をかけてでも開発しやすい環境を整えておくことは大切だと思います。

ずっと自分が開発に関われるわけではないし、1年後にバグ見つかるかもしれません。
この環境づくりは未来の自分の時間の削減と仲間の時間の削減につながります。
そして、後々恨まれないようにできることはやっておきたいなぁ・・・。

## 下心
＞＞＞もっといい方法がある、いつもこの設定をしている、など教えてください！！！


## 自分の環境
どのプロジェクトにも共通するとは思いますが、今回使用したベースの環境は以下の通りです。
- mac
- Laravel sail
- PHP8.1
- Heroku

**テストの環境変数は `.env.testing`を使っています。

# 快適な開発環境を

## 開発段階で設定したいこと

### テストコマンドはカンタンに
例：

https://github.com/gebageba/start-project-base-setting/commit/6dafafd4a826029a40070db25d008169298b2076

→ `composer test`でテストできます
### phpmyadminを追加
例：

https://github.com/gebageba/start-project-base-setting/commit/c8bc1567b1e4056f0010037bb3c25d63fbe604b9

### READMEを書く（誰でもクローンして勝手に始められるようになっている？）
- ReadMeを読めばクローンできるようにしたいですよね。
- コードの書き方や命名規則はある程度統一したいので、参考になる資料を貼っておけば、レビューした時に楽そう（いろいろ。。）
- テストを書いて欲しいなら、どうやってテストが動くのかは書いておきたら丁寧ですよね。
- あと、ブランチ運用や構成が書いてあってもわかりやすいなぁと思います。

例：

https://github.com/gebageba/start-project-base-setting/blob/main/README.md

### GithubActionsにフォーマッターを追加（みんなのコード、ある程度は統一させたいな）
-　GithubActionsに設定してプルリクした時に勝手にフォーマットしてもらうように設定します。
-　勝手にcommitするようにしてあるのでフォーマットは最低限にしたものを使っています。
（一時期、フォーマットしたコードの変更箇所を自動プルリクされるようにしていたのですが...運用が面倒でした😢）

今回使用しているパッケージ：　PHP-CS-Fixer（言語それぞれ何かしらあると思います）

インストールコマンド：
```composer require friendsofphp/php-cs-fixer```

https://github.com/PHP-CS-Fixer/PHP-CS-Fixer

設定ファイルの例：
`.github/workflows/php_cs_fixer.yml` (Github Actions自動コミット)
`.php-cs-fixer.dist.php` (フォーマッターの設定)

https://github.com/gebageba/start-project-base-setting/commit/0590668bb516dfa8ebea2a8a2d9f5c9b155ea3ab

### その機能本当にテストは通っているの🤔
- Github actionsで勝手にテスト回しちゃいます。
一目瞭然！
![GithubActionsの修正_by_gebageba_·_Pull_Request__3_·_gebageba_start-project-base-setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/b8875182-5d6f-c828-1d2d-04a50e385264.png)

例：

https://github.com/gebageba/start-project-base-setting/commit/825cec7d6ee578b822cbd79b3015ad6e2533e558

### main用のGithubActionsはslack通知を入れます
1. Slackにci用のチャンネルを作る
2. Github Secretに`SLACK_WEBHOOK`を追加
3. ymlファイルを追加
4. `prod.yml` の76行目、84行目（Slackのチャンネル名）を編集

https://github.com/gebageba/start-project-base-setting/commit/3eb20154b5c4b9a3711a1d2c8d3d48793e5a0a5c


## リリースする際に設定したいこと
### デプロイ完了のSlack通知（ちゃんとデプロイされた？）
- slackと連携して通知を。
例：　Heroku
1. `Github Secret` に `HEROKU_API_TOKEN` を追加
2. ymlファイルを追加
3. テストが通っていなかったらデプロイしないとか色々設定できます。便利。

https://github.com/gebageba/start-project-base-setting/commit/c757a6bbbf7f268c4fdce3ff6d2e7097a97ede6a

### Sentryの追加（本番環境で予期せぬエラーは出ていない？）
- Sentryを入れてエラー監視を。
1. Sentryに登録して、プロジェクトを追加したら、コマンドを表示してくれるのでその通りにコマンドを打ちます。
2. Sentryはとても便利で、環境ごとにエラーを分けてくれます。 `APP_ENV`と`SENTRY_LARAVEL_DSN`を本番の環境変数に設定します。
3. `SENTRY_LARAVEL_DSN`をローカルの環境変数に追加すると、ローカルのログも監視させるので、ローカルには書かないようにします。
4. エラーが通知されるようにSlackと連携させます。sentryのコンソールからできます。

![sakusaku-library-php_–_sentry_php.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/4559c330-82a0-3360-0a50-7767e02ed771.png)

https://sentry.io/

- 無駄な通知はオフに。
そのままだと、フロント側（４００番台）のエラーもSlackに通知されるので、`Handler.php` の `$dontReport` に通知したくないExceptionを追加します。

![start-project-base-setting_–_Handler_php.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/01910246-49db-4942-ca4e-0506b7bad0c4.png)

## プラスα編
### MessageやErrorMessageは統一されるように設定しておきます。
自分は `Laravel-fractal` を使用しているが、Laravelにある`Resources`を使うなどなんでもいいと思います。

https://github.com/spatie/laravel-fractal

例：

https://github.com/gebageba/start-project-base-setting/commit/e784979a0782f794c803c050ca91df9e28cf0705

### `Handler.php` を活用
４２２のエラーをそのまま返すとフロント側が使いにくかったり、500のエラーには攻撃できる情報（SQLエラーなど）が入っていたりするので、そこら辺をいい感じにします。
例：

https://github.com/gebageba/start-project-base-setting/commit/c3a2876af67566716a14e20be030c0ba77a67756

### Logを日付別に出力させます。
個人の設定ですが、`.env`　ファイルを変更します。
```LOG_CHANNEL=daily```

ログの保存期間を７日間に変更したり...
例：

https://github.com/gebageba/start-project-base-setting/commit/18ed7d96833fdcb16a74da59c88eb7241370b9dd

### swagger
ymlファイルを作るとこまでやっておく。

https://github.com/DarkaOnLine/L5-Swagger


コマンド：
```terminal
//インストール
composer require "darkaonline/l5-swagger"
//設定ファイル
php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"
```
例：

https://github.com/gebageba/start-project-base-setting/commit/a42b34d1cc522a8d315aaf4737ae421d89d6e89e

`/api/documentation` でアクセスできる。


あとは、ER図を自動的に作成したいなぁ。。