آموزش لاراول - مفهوم View Composer

در این مقاله یکی دیگه از مفهوم‌های کاربردی در لاراول به نام View Composer رو آموزش خواهم داد. این قابلیت زمانی کاربرد داره که شما می‌خواهید همواره اطلاعات مشخصی هنگام رندر شدن یک View درون صفحه وجود داشته باشه!

 

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

اگر خاطرتان باشد و دوره مقدماتی رو دنبال کرده بشید ما در آنجا یک پروژه بسیار ساده توسعه دادیم که در آن کاربر می‌توانست اطلاعات آهنگ‌های مورد علاقه‌اش را ذخیره کند. همانطور که در تصویر زیر هم مشاهده می‌کنید ما یک لیست از سبک‌های موسیقی در صفحه ایجاد آهنگ جدید داشتیم:

Image for post
Image for post

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

Image for post
Image for post

همانطور که مشاهده می‌کنید این صفحات نیاز به لیست سبک‌های موجود دارند. حالا تصور کنید بخواهیم یکسری تغییر روی این لیست در کل سیستم داشته باشیم، مثلا بخواهیم یک مرتب‌سازی روی این لیست اعمال کنیم یا فرض کنید فقط آنهایی رو بخواهیم در لیست قرار بدیم که حداقل با یک آهنگ ارتباط داشته باشند و مواردی از این دست که نهایتا مجبور می‌کنن مارو که داخل کنترلرها بگردیم و خط به خط تغییرات رو اعمال کنیم، قطعا این روش منطقی نیست!!! 

یکی از راه حل‌ها این می‌تونه باشه که این متغیر genres یکجا تعریف و در هر view در دسترس باشه! برای این‌ منظور به providers برمی‌گردیم و این متغیر رو بصورت کلی هنگام بوت در سرویس تعریف می‌کنیم.

چنانچه با مفهوم Service Providers ها آشنایی ندارید پیشنهاد می‌کنم مقاله زیر رو حتما مطالعه کنید:

خب حالا بریم در متد boot سرویس AppServiceProvider و متغیر genres رو با کمک متد share از کلاس View و بصورت زیر تعریف کنیم:

Image for post
Image for post

همانطور که مشاهده می‌کنید به موجب دستور بالا لیست سبک‌های موسیقی در تمام مسیرهای سایت وجود داره و در دسترسه و شما می‌تونید هر تغییری که اینجا خواستید در مورد نحوه نمایش اعمال کنید تا در تمامی قسمت‌هایی سایت این تغییرات رو داشته باشید برای نمونه من در اینجا لیست رو بر اساس نام سبک مرتب کردم. 

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

Image for post
Image for post

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

Image for post
Image for post

مشاهده خواهید کرد که این دستور تنها در مسیر تعریف شده کار می‌کنه. البته این امکانم هست از یک آرایه استفاده کنید و یا با استفاده از تعریف گروهی مجموعه‌ای از view ها را لحاظ کنید، مثلا اگر بخواهیم تمامی viewهایی که داخل دایرکتوری resources/songs هستند، تنها کافیه نام مسیرو  بصورت *.songs بدیم.

این نوع تعریف مناسب‌تره و با کمک اون متغیر رو دقیقا جایی که لازم داریم تعریف می‌کنیم. همچنین لاراول این امکان رو به ما می‌ده که توابعی که برای تعریف متغیر استفاده ‌می‌کنیم در کلاس‌های دیگری با عنوان Composer تعریف کنیم. این کلاس‌ها تنها یک متد به نام compose لازم دارند. از طرفی هم چون مسیر پیش‌فرضی وجود نداره می‌تونید هر دایرکتوری که فکر می‌کنید مناسب کار شما هست رو در نظر بگیرید. من در دایرکتوری app\Views\Composers یک کلاس به نام GenreComposer ایجاد کردم (دقت کنید که namespace رو هم وارد کرده باشید):

Image for post
Image for post

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

Image for post
Image for post

نتیجه یکسان است و البته کد خواناتر هست. اما اجازه دهید کمی ماژولارتر عمل کنیم. من در ادامه صفحه دیگری رو اضافه کردم که در اون تنها لیست سبک‌های موسیقی رو نشون میده.

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

Image for post
Image for post

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

در انتها برای تکمیل این ساختار کافیه به AppServiceProvider برگردیم و مسیر view مورد نظر رو بصورت زیر ویرایش کنیم:

Image for post
Image for post

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

Image for post
Image for post

همانطور که مشاهده می‌کنید متغیر به درستی در فایل‌های blade که تعریف کردیم وجود داره و با این تعریف حجم کدها کمتر شده و کدها تمیز‌تر شده‌اند. شما می‌توانید از این ابزار برای اطلاعاتی که پر تکرار هستند استفاده کنید.


در این مقاله با یکی دیگر از مفهوم‌ها در لاراول به نام View Composer آشنا شدید!

امیدوارم از آموزش‌ها لذت برده باشید.