ということで書いていく。
バックエンド
PHPStan / Larastan
Laravel、というよりPHPアプリケーションに対して必須といっても良いくらい大事。
テストを書かない人はまだまだ大半を占めていると感じていたり、カバレッジが充足していないアプリケーションがほとんどだと思うので、テストを書かなくてもある程度堅牢にしてくれるのはレガシー改善職人としては嬉しいところ。
また、Laravelはマジックメソッドが多いためLarastanは必須。Eloquentモデルのプロパティやファサードなどを良い感じに型推論してくれるのはめちゃくちゃ便利。もちろん限界はあるのである程度は割り切って使うのが吉。
構造化ログ
ローカル開発環境はプレーンテキストなログでOKだけど、本番環境・ステージング環境などコンテナサービス上で動いているアプリケーションの場合はJSON形式の構造化ログを出力しておくと良い。こんな感じでログ出力ができる。
class LoggerCustomSetting
{
public function __invoke(Logger $logger): void
{
$introspectionProcessor = new IntrospectionProcessor(Level::Debug, ['Illuminate\\']);
$webProcessor = new WebProcessor();
// リクエストごとのユニークIDをコンテキストに付与
$logger->pushProcessor(new UidProcessor());
// ファイル名・クラス名・関数名・行番号などをコンテキストに付与
$logger->pushProcessor($introspectionProcessor);
// Webリクエスト情報をコンテキストに付与
$logger->pushProcessor($webProcessor);
foreach ($logger->getHandlers() as $handler) {
if ($handler instanceof StreamHandler) {
$handler->setFormatter(new JsonFormatter());
}
}
}
}
config/logging.phpはこんな感じで上記クラスをtapに設定すればOK
'stdout' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => StreamHandler::class,
'tap' => [LoggerCustomSetting::class],
'with' => [
'stream' => 'php://stdout',
],
],
Model::shouldBeStrict()
遅延ロードを防ぐための設定。これによりN+1クエリがある程度防げる。 また、意図しない属性アクセスなども防ぐことができるのでタイポ防止効果もある。 エラーになってしまうため、開発環境のみに入れておいて気付けるような仕組みにしておくと良い。
以下のような感じな設定にすると、本番環境以外でもignore_strictをURLパラメータに入れておくとエラーをスルーして実行できるので必要に応じて入れておくと便利。
Model::shouldBeStrict(
!$this->app->isProduction() &&
$this->app['request'] &&
!$this->app['request']->has('ignore_strict')
);
Laravel Debugbar
開発用にデバッグを簡単にできるツールを入れておくと何かと便利。 Laravel Debugbarは画面下部にデバッグコンソールが表示され、そこでログやクエリ発行、セッション・リクエスト情報を見ることができるので、デバッグ時のvar_dump代わりにもなる。
インストール方法
$ composer require barryvdh/laravel-debugbar --dev
Laravel Pint
フォーマッターは色々あるが、とりあえずLaravel PintというPHP CS FixerをラッピングしたLaravel公式のフォーマッタがあるのでこれを使っておけばOK。気に食わないところはpint.jsonでカスタマイズしつつ。
インストール方法
$ composer require laravel/pint --dev
個人的な趣味嗜好でこんな感じな設定にしている。
{
"preset": "laravel",
"cache-file": ".pint.cache",
"exclude": [
"config",
"bootstrap",
"public",
"resources",
"routes",
"database/migrations"
],
"rules": {
"concat_space": {
"spacing": "one"
},
"binary_operator_spaces": {
"default": "single_space",
"operators": {
"=>": null
}
},
"not_operator_with_successor_space": false,
"new_with_braces": true,
"php_unit_method_casing": false
}
}
DB::listen()でクエリログを出力
ローカル環境・テスト環境ではクエリログを出力しておくと便利。前述のDebugbarでも良いがログにも出しておくと取り回しが良かったり。
とはいえクエリログを毎回出していると見たいログが見れなかったりするので必要に応じて環境変数などでスイッチする仕組みを入れておくと便利。
if (in_array(config('app.env'), ['local', 'testing']) && env('DB_DEBUG')) {
DB::listen(function ($query) {
Log::debug($query->sql, $query->bindings);
});
}
フロントエンド
Vite (Starter Kitにあり)
ビルドする仕組みは初手で入れておくと便利。jQueryを使う場合でもダウンロードしたものをgitコミットするのではなくnpmインストールしたものをビルドして使うようにする。ビルドすることでminifyなど最適な形で配信できるだけでなく、キャッシュバスティング対応も簡単。laravel-vite-plugin を使って簡単にLaravelアプリケーションに組み込むこともできる。
また、ビルドの仕組みをいれると Tailwind CSS や SASS/SCSS などのスタイル面の拡張も簡単にできるのもメリット。
$ npm install vite laravel-vite-plugin
Alpine.js or Inertia.js + React
フロントエンドの選択肢としてjQueryだとなかなかしんどくなるので初手で宣言的UIなものも入れておくと良い。
Alpine.jsはjQueryのように簡単に導入できるし、React(TSX)を書きたい場合はInertia.js + Reactの組み合わせで実装を進めると良い。
TypeScript (Starter Kitにあり)
ビルド環境が整備できるのであればTypeScriptも入れておくと良い。Reactを使う場合はもちろん、Alpine.jsのデータオブジェクトも型安全にできる。それ以外の生JSの場合でもロジック部分を関数化しておけば、TypeScriptの恩恵を受けることができる。
$ npm install typescript
Tailwind CSS (Starter Kitにあり)
SASS/SCSSは辛い…。ので現実解としてTailwind CSSが良いのではと思っている。Reactを使う場合は shadcn/ui などTailwind CSSベースなコンポーネントライブラリもあったりする。Bladeを直接書く場合でもTailwind CSSは保守性の面で良いのではないかなと思っていたり。
$ npm install tailwindcss @tailwindcss/vite
Biome
フロントエンドのフォーマッタ・リンターとしてBiomeが便利。実行が高速で設定量が少ないので保守性も高い。
$ npm install -D --save-exact @biomejs/biome
ただ、Starter Kitはeslint, prettierが入っていて設定ファイルもあるのでそれをそのまま使うのも良いかもしれない。
Vitest
テストツール。フロントエンドの関数やコンポーネントのテストで使う。Vitest Browser Modeも便利。複雑なロジックを組んでいるときに欲しくなるので初手で入れておくと良い。
$ npm install -D vitest
その他
Renovate
定期アップデートする仕組みは初手で入れておくと良い。Renovateの場合はグルーピングしたPRを作成できるので便利。
任意
Laravel Data
FormRequestやAPIResourceのかゆいところに手が届かない感を解消できるツール。
詳細は以下の記事を参照。
https://blog.freedom-man.com/laravel_inertia
TypeScript Transformer
PHPのクラスをTypeScriptの型定義に変換するツール。Inertia.jsを使う場合は便利。Inertia.jsを使わなくてもAPIの型定義をPHP/TypeScriptで共有するときは有用かも。
不要になった?
laravel-ide-helper
PHPStormでLaravel Ideaのプラグインが利用できるようになったため不要になったかも?
めちゃくちゃお世話になりました…!
まだ検証できていない
Laravel Boost
MCPや生成AI用のガイドラインを作ってくれる。生成AIによるLaravel開発をより効率的に進められる予感。