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 می باشد.
دیدگاهتان را بنویسید