آموزش لاراول - مفهوم View Composer
در این مقاله یکی دیگه از مفهومهای کاربردی در لاراول به نام View Composer رو آموزش خواهم داد. این قابلیت زمانی کاربرد داره که شما میخواهید همواره اطلاعات مشخصی هنگام رندر شدن یک View درون صفحه وجود داشته باشه!
اجازه بدید ابتدا پیش از اینکه مستقیم سراغ این مفهوم بریم یک مثالی بزنیم تا متوجه قابلیت کاربردی این ابزار در جریان کار بشیم و بهتر آنرا درک کنیم. خب من در این آموزش یک کپی از پروژه مقدماتی رو پیادهسازی کردم و اون رو به دیتابیس sqlite هم متصل کردم. میتونید برای آشنایی با نحوه اتصال به دیتابیس sqlite مقاله زیر را مطالعه کنید:
اگر خاطرتان باشد و دوره مقدماتی رو دنبال کرده بشید ما در آنجا یک پروژه بسیار ساده توسعه دادیم که در آن کاربر میتوانست اطلاعات آهنگهای مورد علاقهاش را ذخیره کند. همانطور که در تصویر زیر هم مشاهده میکنید ما یک لیست از سبکهای موسیقی در صفحه ایجاد آهنگ جدید داشتیم:


اجازه بدید به کنترلر آهنگا بریم و کد مربوط به این مسیر رو بررسی کنیم:


همانطور که مشاهده میکنید این صفحات نیاز به لیست سبکهای موجود دارند. حالا تصور کنید بخواهیم یکسری تغییر روی این لیست در کل سیستم داشته باشیم، مثلا بخواهیم یک مرتبسازی روی این لیست اعمال کنیم یا فرض کنید فقط آنهایی رو بخواهیم در لیست قرار بدیم که حداقل با یک آهنگ ارتباط داشته باشند و مواردی از این دست که نهایتا مجبور میکنن مارو که داخل کنترلرها بگردیم و خط به خط تغییرات رو اعمال کنیم، قطعا این روش منطقی نیست!!!
یکی از راه حلها این میتونه باشه که این متغیر genres
یکجا تعریف و در هر view در دسترس باشه! برای این منظور به providers برمیگردیم و این متغیر رو بصورت کلی هنگام بوت در سرویس تعریف میکنیم.
چنانچه با مفهوم Service Providers ها آشنایی ندارید پیشنهاد میکنم مقاله زیر رو حتما مطالعه کنید:
خب حالا بریم در متد boot سرویس AppServiceProvider و متغیر genres
رو با کمک متد share از کلاس View و بصورت زیر تعریف کنیم:


همانطور که مشاهده میکنید به موجب دستور بالا لیست سبکهای موسیقی در تمام مسیرهای سایت وجود داره و در دسترسه و شما میتونید هر تغییری که اینجا خواستید در مورد نحوه نمایش اعمال کنید تا در تمامی قسمتهایی سایت این تغییرات رو داشته باشید برای نمونه من در اینجا لیست رو بر اساس نام سبک مرتب کردم.
پس از تعریف متغیر genre اگر وارد کنترلر بشید و قسمتهایی که در آن لیست Genre کوئری شده و به view پاس دادید رو حذف کنید خواهید دید که viewها هیچ مشکلی نخواهند داشت. برای نمونه صفحه ایجاد آهنگ ما حالا بدون دریافت لیست سبکهای موسیقی در کنترلر کار میکند:


اما این روش خیلی اینجا منطقی به نظر نمیاد چرا که هربار که یه view ایجاد میشه یک کوئری هم خواهیم داشت که احتمالا در همه مسیرهامون هم به اون نیاز نداشته باشیم. برای رفع این مورد از متد composer استفاده میکنیم. این متد به عنوان آرگومان اول یک view یا یک آرایه از viewها رو میگیره یعنی جایی که میخواهیم متغیر تعریف شده باشه رو تعیین میکنیم سپس با آرگومان دوم بصورت callback متغیر و اطلاعاتی که میخواهیم رو تعریف میکنیم:


مشاهده خواهید کرد که این دستور تنها در مسیر تعریف شده کار میکنه. البته این امکانم هست از یک آرایه استفاده کنید و یا با استفاده از تعریف گروهی مجموعهای از view ها را لحاظ کنید، مثلا اگر بخواهیم تمامی viewهایی که داخل دایرکتوری resources/songs
هستند، تنها کافیه نام مسیرو بصورت *.songs
بدیم.
این نوع تعریف مناسبتره و با کمک اون متغیر رو دقیقا جایی که لازم داریم تعریف میکنیم. همچنین لاراول این امکان رو به ما میده که توابعی که برای تعریف متغیر استفاده میکنیم در کلاسهای دیگری با عنوان Composer تعریف کنیم. این کلاسها تنها یک متد به نام compose لازم دارند. از طرفی هم چون مسیر پیشفرضی وجود نداره میتونید هر دایرکتوری که فکر میکنید مناسب کار شما هست رو در نظر بگیرید. من در دایرکتوری app\Views\Composers
یک کلاس به نام GenreComposer
ایجاد کردم (دقت کنید که namespace رو هم وارد کرده باشید):


حالا به AppServiceProvider برگردید و از این کلاس در آرگومان تعریف متغیر استفاده میکنیم:


نتیجه یکسان است و البته کد خواناتر هست. اما اجازه دهید کمی ماژولارتر عمل کنیم. من در ادامه صفحه دیگری رو اضافه کردم که در اون تنها لیست سبکهای موسیقی رو نشون میده.
حالا وارد دایرکتوری resources/views میشم و یک فولدر به نام components میسازم که درون اون یک فولدر دیگه به نام genres وجود داره. در نهایت هم دوتا فایل blade برای منوی انتخاب و لیست نمایشمون ایجاد میکنم:


حالا هرجا که این دوتا مورد رو لازم داریم از include استفاده میکنیم. در این پروژه من در صفحه ایجاد و ویرایش آهنگها به منو انتخاب سبکها و در صفحه نمایش تمامی سبکها هم به لیست سبکها احتیاج دارم. شما هر نوع دیگری از نمایش رو میتونید داخل این دایرکتوری داشته باشید با علم به این موضوع که در این view ها دیتای سبکها موجوده و نیازی به کوئری زدنهای چندباره ندارید!
در انتها برای تکمیل این ساختار کافیه به AppServiceProvider برگردیم و مسیر view مورد نظر رو بصورت زیر ویرایش کنیم:


حالا به هر دو صفحه باز میگردیم و خروجی بصورت زیر خواهد بود:


همانطور که مشاهده میکنید متغیر به درستی در فایلهای blade که تعریف کردیم وجود داره و با این تعریف حجم کدها کمتر شده و کدها تمیزتر شدهاند. شما میتوانید از این ابزار برای اطلاعاتی که پر تکرار هستند استفاده کنید.
در این مقاله با یکی دیگر از مفهومها در لاراول به نام View Composer آشنا شدید!
امیدوارم از آموزشها لذت برده باشید.