کلاس‌های تک اکشن در کنترلر لاراول با متد __invoke()

پیش به سوی کدنویسی تمیز تر ...
پیش به سوی کدنویسی تمیز تر ...

سلام دوستان . تو این مقاله میخوام درباره کلاس های تک اکشن تو لاراول صحبت کنیم . و اینکه اصلا به چه کاری میاد این روش استفاده از کنترلر .

بعضی وقتا کنترلر شما بجز متد های show , update , store , index , delete, ... شامل خیلی متدهای دیگه هم شاید باشه . اونوقت که هر وقت سروکارت به این کنترلر بیوفته باید کلی دنبال کدهاتون بگردید و ... وای به روزی که داکیومنت نویسی هم نکرده باشی ...




متد جادویی invoke در php :

زبان php یکسری متد پیشفرض داره به اسم مجیک متد ( magic method ) . یا همون متدهای جادویی .

این متدها با ۲ تا آندرلاین ( ــ ) شروع میشن . این اسامی توسط php رزرو شدن و شما نمیتونید اسم متدهاتون رو شبیه شون بزارید .

تو php ورژن 5.3 یه متدی جادویی به اسم __invoke اضافه شد. __invoke() یک تابع magic در php است و هنگامی که ما می‌خواهیم یک نمونه از کلاس ایجاد کنیم یا به این کلاس فراخوانی کنیم __invoke() به صورت خودکاربارگیری می‌شود.



ایجاد کلاس تک اکشن در کنترلر :

برای اینکه کنترلرمون رو خلوت کنیم کافی مثلا برای یکی از متدهایی که تو کنترلرمون داریم ، یه کلاس جداگونه بسازیم . مثلا من مدل Book دارم و یه کنترلر BookController .

این کنترلر ما یه متد داره مثلا به اسم registerBook . کافی ما یه کنترلر بسازیم برای این متد :

namespace App\Http\Controllers;  
use Illuminate\Http\Request;  

class RegisterBookController extends Controller {    
        public function __invoke() {         
                // any things   
         } 
}

حالا هرکاری که قرار بود این متد انجام بده داخل متد invoke بنویسید .

برای این کنترلر هم باید روت مخصوص به خودش نوشته بشه :

Route::post('registerBook', 'RegisterBookController'); 

نکته : اگر از این روش استفاده کنید نمیتونید از resource روت ها استفاده کنید !

ما تونستیم با این کار یه متد از کلاس کنترلر اصلی Book کم کنیم و کدمون رو واضح تر کنیم .


امیدوارم این چند خط نوشته به درد شما بخوره .

موفق باشید .