1. __invoke メソッドとは
invoke? と聞けばあの曲が脳内再生されるのは、私だけではないはず…。
(SEEDファンにはたまらないやつですね)
…と余談はさておき。
「invoke」の意味
「invoke」は英語で「呼び出す」という意味。
PHPでは__invoke()
という名前の 特殊メソッド(マジックメソッド) を定義することで、
クラスのインスタンスを「関数のように」呼び出す ことができるようになります。
Laravelでの主な用途
Laravelでは、__invoke は主に以下のような場面で使われます
✅ シングルアクションコントローラ
→ 1つの処理だけを担当する簡潔なコントローラを作りたいとき
✅ サービスクラスの関数的活用
→ 再利用可能な処理を、関数のようにスッキリ書きたいとき
✅ 処理をクラス単位に分けて、テストや責務の分離をしたいとき
2. 使用例:サービスクラスとしての活用
以下は、UpdateStatusService
というサービスクラスを作成し、
yController
および zController
の中で共通の更新処理として再利用している例です。
🔧 サービスクラス:UpdateStatusService
<?php
namespace App\Services;
use App\Model\Xxxxx;
class UpdateStatusService
{
/**
* ステータスを更新する
*/
public function __invoke(Xxxxx $xxxxx, string $status): void
{
$xxxxx->update([
'status' => $status,
]);
}
}
このように __invoke メソッドを定義することで、
このクラスは「関数」のように $updateStatusService($xxxxx, $status) と呼び出せるようになります。
🧩 yControllerでの使用例
public function updateStatus(Request $request, UpdateStatusService $updateStatusService): JsonResponse
{
// ※権限チェックなどの処理は割愛
// ステータス更新処理をサービスクラスに委譲
$updateStatusService($lesson, $request->status);
return response()->json([
'result' => true,
]);
}
🧩 zControllerでの使用例
public function updateStatus(Request $request, UpdateStatusService $updateStatusService): JsonResponse
{
// ※権限チェックなどの処理は割愛
// 同様にサービスクラスを呼び出してステータス更新
$updateStatusService($lesson, $request->status);
return response()->json([
'result' => true,
]);
}
3. __invoke を使うメリット
メリット 説明
✅ 関数のように呼び出せる $service($data) のようなスッキリした記述になる
✅ 責務の分離 コントローラの肥大化を防ぎ、1クラス1責任にできる
✅ テストしやすい ロジックが独立しているため、ユニットテストも簡単
✅ Laravelの依存注入と相性◎ 自動でコンストラクタやサービスを注入してくれる
4. まとめ
__invoke()
は、関数のようにクラスを呼び出せる「ちょっと便利な魔法」です。
サービスクラスや単一処理のコントローラ、バリデーションなど、Laravelのコードを
より読みやすく、テストしやすく、再利用性の高い形にできる 強力な仕組みです。