とあるプロジェクトへの参加メモ
- DBeaver MySQLクライアント
- NoSQL Booster Mongoクライアント
- postman
- api管理サービス
- swaggerとかあれ系だが、ダミーデータじゃなくて実際にRESTFullなApiを投げるサービス
- https://sequel-ace.com/
- 使ったことないけど、sequel-proの後継らしいので多分使いやすい
- vscodeでbreak pointが貼れるようになってそれはかなり助かった。
- vagrantでやってたが、macだとdockerめちゃくちゃ重たいのでvagrantでよかったような気がする
laravelというかlumenのベースでいい感じのフォルダ構成でルールもある
transformとかその辺もあるのでどのモデルをいじっても同じデータ構造で返すし、policyで例えばuser_idが一致してないとselect時にerrorにするなど細かい設定もできた、
ただ、l5-repositoryが結構癖が強かった。
Serviceクラスが全てBaseのサービスクラスを継承していて、
- ServiceクラスからSQLを実行する
- またはServiceクラスからReposotryクラスのSQLを実行する
というパターンが多いが、User::all()だと普通はUserモデルクラスが返ってくるが、Serviceクラスを経由すると全部Arrayになってた.
Arrayにさせないパターンは一応できるが、それだとtransformクラスを通らないためレスポンスの形式がApiレベルで変わってしまい統一しにくかった.
他にもデメリット的にmodelクラスに生やしたメソッドが使えないので配列を似たようなif文でめちゃくちゃ見るみたいになっててそれも辛かった。
例) if isAdmin? -> if model.type === 'admin'
それ以外にもチューニング周りは絶望的だった。
githubに書いてるが、http://prettus.local/users?search=John&searchFields=name:like
みたいなリクエストでクライアントから呼べばGraphQL風?な感じでとりたいデータが取れるようになってた.
しかし、indexが効かないクソみたいなクエリが大量に発生かつそもそもServiceクラスのほとんどがいわゆるN+1クエリ大量に発行してたのでそれはめちゃくちゃ直した
まぁそれでもpolicyといわれる認証やフォルダ構成は結構しっかりしておりあとから見た人でもわかりやすかったと思う
# carbon便利だけど日付をvar_dumpとかで表示させたい場合いつも忘れる
Carbon::now()->toDateTimeString()
- https://github.com/barryvdh/laravel-debugbar
- これ使ってないけどまぁpostmanがその代わりといえばそうだから使わないか
- https://zenn.dev/nshiro/articles/069ed399404934
- modelに入れることでN+1が検出できるらしい。laravel 8.4.3以上
laravel7.3 + php7系
- コードがシンプルにひどい.
- serviceクラスがあったが、5000行以上あったのでそれを役割ごとにファイル分割していったがそれでも900行ぐらいは残った
- repositoryパターンとしてSQLだけ別ファイルにあればよかったんだが、それもないから結構厳しい戦いだった
- home画面でSQLが300行実行されてるかつ同じSQLも何回も発行されているし、bulkInsert使ってないから3000行を一括でinsertするとかいろいろ辛い作りになっていた
- N+1をなるべく減らすためにwithを多様していたのはいいが、そもそも作りがめちゃくちゃイケてないので無駄クエリが多い+影響範囲が大きすぎるので修正が大変すぎた(以下サンプルコード参照)
- 以下のようなコードがあちこちに書いており、呼び出し元も不明という感じでめちゃくちゃ辛い。
- php8使っていればenumとか使えたのにそれも使ってないから文字列で比較するのも辛い
- modelに関数がほぼなくて、全部serviceクラスに寄せていたので共通のロジックがバラバラになっていた。大体userクラスにロジック偏るはずだがほぼ素のリレーションしかなかった
- typoとインデントが揃ってないとか気になった(これはめちゃくちゃ個人的だが
- デバッグの効率がとにかく悪かったので、1件のバグ再現を手元でするのに5時間ぐらいかかるレベルだったのでそれの効率をとにかくあげた
- コミットメッセージが適当すぎるので過去の意図が全然わからない
- indexが微妙だし、全テーブルにactiveってカラム(おそらくsoft_delete的な)があって、それで毎回絞ってるので微妙にindexが効いてない
$user = User::with(['profile' => function ($query) {
$query->with(
[
'profileSample' => function ($query) {
$query->where('active', 1)
->orderBy('id', 'asc');
},
]
)->where('active', 1);
}])
->where('id', $user_id)
->where('active', 1)
->first();
マスターファイルがとても大きいかつ毎回SQLで引いてたので、それをやめるべくキャッシュを入れた.
本来ならmemcachedとかredisに入れたかったが、マスターファイルも結構大きいのでネットワーク的に数十MBとかのほうが辛いかと思って、一旦ファイルにした.
(インフラ的な手間もかからないのも考慮したが)
# このコマンドで削除(fileはわざわざ指定しないとダメっぽい)
php artisan cache:clear -- file
php artisan cache:clear -- redis
- https://qiita.com/fuchigami/items/2ca360beac787319195f だと動かなかった
- https://note.com/rei_7010/n/n6671479aa9cc
参考までにそれぞれのパフォーマンスが書いた記事貼っておく.
dokcerファイルが20GBぐらいになってたので、以下コマンドで5Gぐらい減った(それでも多いが)
docker system prune --volumes -f
vagrant + docker-composeでファイルが大きくなったので削除 https://scrapbox.io/jiro4989/%2Fvar%2Flib%2Fdocker%2Foverlay2%E3%81%AE%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E8%82%A5%E5%A4%A7%E5%8C%96%E5%AF%BE%E5%BF%9C#5f65bac67ba7f9000013efc3
- https://github.com/azuyalabs/yasumi (祝日関係のライブラリ)
- https://github.com/spatie/laravel-http-logger (アクセスログのライブラリ)
- https://github.com/datacreativa/laravel-presentable (simplaなpresenterを追加するライブラリ)
- https://github.com/renatomarinho/laravel-page-speeda (ページ圧縮ライブラリ(実質使ってないからよくわからない)
- array flat
- 再ログインで419問題
throwResponse
コントローラーの任意の場所でリダイレクトさせる