تزریق توابع در کنترلرها در لاراول

چاپ

وظیفه ی facadeها در لاراول، این است که کاربردی ترین کلاس های لاراول را در اختیار ما قرار دهند. با استفاده از facadeها می توانیم در مورد درخواست های جاری(request) و ورودی های کاربر(user input) و کش(cache) و دیگر موارد اطلاعات مورد نیاز را به دست بیاوریم. 

 اما اگر ترجیح می دهید که کلاس ها و توابع خودتان را تزریق(اضافه) کنید، و یا اگر می خواهید از سرویسی استفاده کنید که دارای facade نمی باشد، به راهی نیاز خواهید داشت که به وسیله ی آن بتوانید از این کلاس ها(یعنی کلاس های خودتان) در داخل کنترلرها نمونه گیری کنید(instance). اینجا است که باید service container در لاراول را به شما معرفی کنیم. 

اگر فعلا service container برای شما ناآشنا به نظر می رسد، می توانید آن را بعنوان بخش کوچکی از قابلیت های عالی لاراول تصور کنید. برای اطلاعات بیشتر در مورد آن، می توانید به فصل 11 مراجعه کنید. 

 تمام متدهای کنترلر(حتی constructorها) از طریق container لاراول بازپس گیری(resolve) می شوند. 

بعنوان مثال اگر بخواهیم به جای استفاده از facadeها، از شیء Request نمونه گیری کنیم،باید چکار کنیم؟ تنها کافیست عبارت Illuminate\Http\Request را در پارامترهای متد خود مورد استفاده قرار دهیم. درست مانند مثال 3.25.

// TasksController.php
...
public function store(\Illuminate\Http\Request $request)
{
  $task = new Task;
  $task->title = $request->input('title');
  $task->description = $request->input('description');
  $task->save();
  return redirect('tasks');
}

 همان طور که در کدهای بالا مشاهده می کنید، برای متد ()store یک پارامتر تعریف کرده ایم ( و آن را به این متد پاس داده ایم). حالا چون که برای این پارامتر از عبارت Illuminate\Http\Request (که یک فضای نام است) استفاده کرده ایم، لاراول متوجه می شود که چگونه باید نام آن کلاس را بازپس گیری(resolve) کند. بنابراین اکنون ما یک شیء Request داریم که بدون هیچ مشکلی، آماده ی استفاده در متد store می باشد. و دیگر نیاز به Bind کردن(ذخیره کردن) به طور صریح نمی باشد. و شیء ایجاد شده در داخل متغیر request$ قرار گرفته است. 

نکته

به تعریف و ذخیره کردن متغیرها و دیگر موارد، در داخل service container، بایند(bind) کردن گفته می شود.

این روش گرفتن ورودی از کاربر، توسط نویسنده ی این کتاب و دیگر توسعه دهندگان لاراول نسبت به استفاده از Input facade ترجیح داده می می شود. زیرا تنها کافیست یک نمونه از کلاس Request گرفته شود و سپس ورودی کاربر خوانده شود.