معمولا در شروع پروژه ها کنترلر های ما پر از کدهایی است که هر کدام یک کار انجام می‌دهند. به مرور این باعث می‌شود کنترلر بیش از حد بزرگ شود و نگهداری از برنامه هم سخت تر.

برای حل این مشکل برنامه نویس‌ها راه های مختلفی دارند و پیشنهاد می‌کنند. اما یک راه ساده و در عین حال موثر که بسیاری از لاراول کارها به کار می برند استفاده از Action ها است.

Action در واقع یک کلاس ساده است که یک متد بیشتر ندارد و قرار است تنها یک کار انجام دهد.

بیایید با هم یک مثال از پروژه bugtracker ببینیم.

داخل پوشه app یک پوشه می سازیم به اسم Actions. این پوشه محل قرار گرفتن همه اکشن هاست.

یک فایل php به نام CreateIssueAction داخل این پوشه ایجاد می کنیم.

داخل فایل حتما namespace را باید بنویسیم تا این فایل در کل پروژه قابل دسترسی باشد.

<?php

namespace App\Actions;

use App\Models\Issue;
use Illuminate\Http\Request;

class CreateIssueAction
{
    public function execute(Request $request){

        $issue = new Issue();
        $issue->project_id = $request->project_id;
        $issue->title = $request->title;
        $issue->description = $request->description;
        $issue->assigned_to_user_id = $request->assigned;
        $issue->priority = $request->priority;
        $issue->status = $request->status;
        $issue->created_by_user_id = auth()->id();
        $issue->save();

    }


}

در این مثال کلاسی که ساختم تنها یک کار انجام می دهد و آنهم ایجاد یک issue در دیتابیس است.

متد execute، ریکوئست(request$) را دریافت می‌کند. با این روش در کنترلر فقط این action را صدا می‌زنیم و ریکوئست را پاس می دهیم:

class IssueController extends Controller
{
   public function store(Request $request){
        

        (new CreateIssueAction)->execute($request);

    }
}

با استفاده از این روش ساده بخش های مختلف نرم افزار را به صورت جداگانه در اکشن های مختلف می نویسیم. اینطوری codebase خواناتر و تمیزتری خواهیم داشت.