Fusic Tech Blog

Fusion of Society, IT and Culture

Laravelのライフサイクル #Laravel輪読会 Vol.1
2021/08/26

Laravelのライフサイクル #Laravel輪読会 Vol.1

FusicチームLIGHTの吉野です!

最近スーファミのドンキーコングにハマってしまい、寝る前にやり過ぎて寝不足気味です。

今回からこのテックブログの場をお借りして、チーム内で実施しているLaravel輪読会で学んだことをアウトプットしていきたいと思います。

チームLIGHTの紹介

チームLIGHTは現在エンジニア5名、デザイナー2名、インターン1名の合計8人のチームです。 チームLIGHTの雑記ブログもありますので、よかったらそちらもそうぞ! こちらは技術的な内容ではなく、メンバーの日常のことをつらつらと書いています。

LIGHTブログ

また、不定期でLIGHT@NOONという配信イベントも開催しています。

LIGHT Youtubeチャンネル

Laravel輪読会の紹介

チームLIGHTでは、週に1回1時間、Laravel輪読会を実施しています。

輪読会で読む本はこちらの本です!

PHPフレームワークLaravel Webアプリケーション開発 バージョン8.x対応

PHPフレームワークLaravel Webアプリケーション開発 バージョン8.x対応

2021/6/1に発売されたばかりの本で、Laravel8にも対応しています。

ボリュームもたっぷりな上に、Laravelの設計やテストコードに関する内容も充実しているので、オススメです!

本題

今回読んだページはP.56 ~ P.63 の「2-1 ライフサイクル」についてです。

ライフサイクルについて

Laravelアプリケーションの実行の流れは

  1. サーバー
  2. エントリポイント
  3. HTTPカーネル
  4. ルータ       
  5. ミドルウェア   
  6. コントローラ

という順番で実行されます。

それぞれの動作に関して、書籍を読みながら、実際にLaravelのコードを読み進めました。

チームで話したこと

public/index.phpからLaravelの世界ははじまる

  • public/index.phpからLaravelが起動し、レスポンスを送り、終了するまでの処理が発生する。

P.60に関して、Routeのコントローラーだけ書くと、__invokeは発火する。それしかやらない書き方もある。

  • routesの書き方として、「TaskController」のように、メソッドを指定しない場合、__invokeが発火する。
  • Controller内にメソッドを書かずに__invokeだけで実装する事例もある(Fusicではあまり聞かない)

P.62 コントローラでメソッドインジェクションは微妙かも?__construct()でnewしよう!

use App\Services\TaskService;

class TaskController extends Controller
{
    public function getTask(Request $request, TaskService $service)
    {
        $tasks = $service->findTasks($request->get('is_done));
    }
}

上記のように、「TaskService」をメソッドインジェクションでもってくるよりは

use App\Services\TaskService;

class TaskController extends Controller
{
    private TaskService $service;

    public function __construct(TaskService $service = null)
    {
        $this->service = $service ?? new TaskService();
    }

    public function getTask(Request $request)
    {
        $tasks = $this->service->findTasks($request->get('is_done));
    }
}

の書き方の方が、各メソッドがごちゃごちゃしなくてよさそう。

routesの書き方、配列か@か問題

  • Fusic内では@で書く人が圧倒的に多いイメージ。

routesの書き方、Appから書くと、変なとこから持ってきてる感。Controller名だけでよくない?

Route::post('/tasks', 'App\Http\Controllers\AddTaskAction');

に関して、「App\Http\Controllers」は余計な記述かも。

特殊なPATHの際に明示するだけでもよさそう。

routesでクロージャーを使うと、routeのキャッシュが効かなくなる

Routeの以下のような書き方。

Route::get('/hello', function (Request $request) {
  return view('hello');
})
  • この書き方をすると、routeのキャッシュが効かなくなってしまう。
  • php artisan route:cacheを実行すると、以下のエラーが発生する。
Unable to prepare route \[...] for serialization. Uses Closure.
  • 大規模アプリだとデプロイの度にroute:cacheした方がいいので、基本はクロージャーは使わない。

P.59に関して、RequestHandledをListenしたい時ってどういう時だろう?

  • RequestHandled自体は何もしてなさそう
  • 何かしらイベントが必要な時に使うのかも?

今日はこんな感じの輪読会でした!

次回はサービスコンテナをやります!

お楽しみに!

yoshino

yoshino

Fusicエンジニア。Webアプリケーションやブロックチェーンプログラミングをしています。PHP, Vue.js, Solidity etc..