اشتباه رایج ، تعریف متغیر های سراسری در متد سازنده کنترلر ها!
یکی از اشتباهات رایجی که برنامه نویس های لاراول مرتکب میشوند تعریف متغییر های سراسری در جای نامناسب است که معمولا به دلیل استفاده مکرر از این متغیر ها در صفحه هات مختلف سایت ، آنها را در متد سازنده Constructor تعریف میکنند . از نظر فی این شکل تعریف متغیر هیچ ایرادی ندارد و در حالت عادی همه چیز به خوبی کار میکند اما مشکل زمانی حاد می شود که لاراول بنا به شرایطی متد سازنده و کنترلری که معرف متغیر های سراسر است را فراخوانی نکند !. مثلا زمانی که یک exception (استثنا) در لاراول رخ میدهد یا زمانی که یک صفحه پیدا نمی شود ولاراول خطای ۴۰۴ page note found را نمایش میدهد . همین خطای ۴۰۴ یک نمونه بارز از نحوه به وقوع پیوستن این خطا می باشد ! چگونه ؟
مثلا شما یک متغیر با نام user$ که حاوی اطلاعات کاربر شما است را در متد سازنده کلاس BaseController خود مانند زیر تعریف می نمایید :
1 2 3 4 5 6 7 8 |
class Controller extends BaseController { function __construct() { View::share('user', Auth::user()); View::share('social', Social::all()); } } |
و این متغیر ها را در هدر و فوتر سایت نمایش می دهید . در نگاه اول همه چیز خوب و درست بنظر میرسد . اما خطا زمانی رخ میدهد که یک صفحه error یا صفحه ۴۰۴ نمایان میشود . این صفحات بدون فراخوانی کنترلر/اکشن نمایان می شوند پس در این حالت متد سازنده کنترلر نیز فراخوانی نمیشود . بنابراین هیچکدام از متغیر های ما ایجاد نخواهند شد !. این یک اشتباه رایج در لاراول و پروژه بزرگی که تمامی صفحات سایت ازجمله صفحات error از یک هدر فوتر یکسان استفاده میکنند می باشد.
یک راه حل تعریف متغیر های سراسری در سرویس ها می باشد . شما میتوانید برای حل این مشکل یک سرویس مجزا تعریف کنید و متغیر های سراسری را در متد register آن فراخوانی کنید یا ایکنه از سرویس موجود AppServiceProvider استفاده کنید و متغیر ها را در آن تعریف نمایید .
1 2 3 4 5 6 7 8 9 10 11 |
class AppServiceProvider extends ServiceProvider { public function boot() { // Using view composer to set following variables globally view()->composer('*',function($view) { $view->with('user', Auth::user()); $view->with('social', Social::all()); }); } } |
نکته : تمامی view composer ها به وسیله service container لاراول فراخوانی می شوند . این بدین معنی است که شما میتوانید وابستگی های (dependencies) موردنظر خود را به عنوان پارامتر ورودی type-hint کنید .
اطلاعات بیشتر در مورد service container و view composer .
آخرین دیدگاهها