تعداد بازدید: 714

Controller Logics

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

Program Logics

در ریاضیات وقتی میخواستیم یه مساله ای رو حل کنیم باید فرمول رو به همراه داده ها بهمون میدادن . بقیه اش میشد اعمال جبری. حالا این logic معادل همون اعمال جبری در ریاضیات است.به طور کل وقتی میگیم logic منظور کدهای موجود در کنترلر هست.
مثلا عملیات ذخیره یک resource در پایگاه داده فرمولش استفاده از مدل هست. حال این کارهایی نظیر گرفتن داده از کاربر و validation و … میشه logic.

Logic ها بنا به نوع کنترلرها به روش های مختلفی می توانند پیاده سازی گردند. به طور مثال یک کلاس به همراه متد های مختلف یا یک کلاس به ازای یک یا چند Logic که عملیات های مختلفی را شامل می شود.

Implements Logics

روش اول ) یک پوشه در Http با نام Logics می سازیم و در آن Action های مختلف به ازای مدل های مختلف می سازیم. هر دسته Action یک فایل با نام برگرفته از نام مدل مثلا BookActions که در آن کلاس متد های لازم را به ازای هر Logic می سازیم. مثلا متد های store , update , delete یا حتی عملیات های دیگری نظیر AddToCart که شاخصی متفاوت دارد.

namespace App\Http\Logics;

use App\Book;
use App\User;
use App\Events\BookCreated;

class BookAction
{
    public function store(User $user ,array $data)
    {
        $bookInputs = array_only($data,['name', 'pages', 'isbn', 'price', 'published_at']);
        $categories = array_get($data,'categories');
        $authors = array_get($data,'authors');

        $result = $book = $user->books()->create($bookInputs);
        $book->categories()->attach($categories);
        $book->authors()->attach($authors);
        event(new BookCreated($user,$book));
        return ($result)? true : false;
    }

    public function update(Book $book,array $data)
    {
        $bookInputs = array_only($data,['name', 'pages', 'isbn', 'price', 'published_at']);
        $categories = array_get($data,'categories');
        $authors = array_get($data,'authors');

        $result = $book->update($bookInputs);
        $book->categories()->sync($categories);
        $book->authors()->sync($authors);

        return ($result)? true : false;
    }

    public function delete($book)
    {
        return $book->delete();
    }

}

از کلاس بالا در کنترلر های خود استفاده می کنیم.مثلا هم در Api/BookController و هم در BookController می توانیم از Action های کلاس بالا استفاده کنیم.

public function update(UpdateBook $request, int $id, BookAction $action)
{
    $book = Book::findOrFail($id);
    $user = auth('api')->user();
    $this->authorize('update',$book);
    $result = $action->update($book, $request->all());
    if ($result) {
        return response()->json(['message' => 'successfull'], 200);
    } else {
        return response()->json(['message' => 'fail']);
    }
}
public function update(UpdateBook $request,int $id, BookAction $action)
{
    $book = Book::findOrFail($id);
    $this->authorize('update',$book);
    $action->update($book,$request->all());
    return redirect("books/{$id}");
}

ضمن پیاده سازی Action ها نکات زیر را در نظر داشته باشید:

  • Logic فقط جهت پیاده سازی یک سری کد ساده فارغ از Request/Response می باشند. این کنترلر است که در چرخه Request تا Response انجام وظیفه می کند.
  • namespace کلاسی که برای Logic ها در نظر گرفته ایم به ازای مسیر app/Http/Logics برای کلاس BookAction برابر با  App\Http\Logics\BookAction می باشد. زمان فراخوانی Action در کلاس هم به طور مثال به ازای logic با نام BookAction هم App\Http\Logics\BookAction
  • ضمن کوتاه تر کردن هر چه بیشتر کنترلر ها به ازای هر Request برای validation استفاده کنید. به طور مثال در کد های بالا از UpdateBook استفاده کرده ایم که در دایرکتوری Request ها عملیات validation را با آن انجام می دهیم.
  •  کنترلر اصلی ۵ متد اصلی index , show , edit , update , create , store , destroy را دارا می باشد. سعی کنید برای انجام متد های دیگری از کنترلر یک کنترلر جدید ایجاد کنید. مثال AddToCartController که متد های مربوط به افزودن به سبد خرید را انجام می دهد. این کنترلر هم می تواند Logic داشته باشد. به عنوان یک قانون هر جا کدی از کنترلر بیش از یک بار استفاده می شد به Logics آن را منتقل کنید.

روش دوم ) ساخت یک کلاس به ازای یک Logic . مثلا ساخت یک فایل با نام CreateBook بسازیم . در این روش برای Logic های بزرگ استفاده می کنیم.

namespace App\Http\Logics;

use App\Book;
use App\User;
use App\Events\BookCreated;

class CreateBook
{
    public function execute(User $user ,array $data)
    {
        $bookInputs = array_only($data,['name', 'pages', 'isbn', 'price', 'published_at']);
        $categories = array_get($data,'categories');
        $authors = array_get($data,'authors');

        $result = $book = $user->books()->create($bookInputs);
        $book->categories()->attach($categories);
        $book->authors()->attach($authors);
        event(new BookCreated($user,$book));
        return ($result)? true : false;
    }
}

نحوه فراخوانی این کلاس نیز بسته به نام آن متفاوت خواهد بود(بنا به نام کلاس و مسیر). سایر قوانین مربوط به پیاده سازی Logic نیز مانند روش اول می باشد.

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

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای Controller Logics

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *