Laravel Share: پکیجی برای به اشتراک گذاری داده‌ها در ریکوئست

همیشه در انجام پروژه‌ها سعی می‌کنم کاری که باید چند بار انجام بشه رو تبدیل به یه فرآیند کنم. منظورم تابع و کلاس نیست. منظورم تبدیل‌ش به مجموعه‌ای اتفاقات هست که می‌تونه بارها و در حالت‌های یکسان یا مشابه استفاده بشه.

همین عادت همیشگی باعث شد روی مشکلی کار کنم که فکر می‌کنم راه حل خوبی برای اون پیدا کردم.

زمانی که ۲ سال پیش شروع به ساخت ماژول‌ها در لاراول برای انجام پروژه‌ها کردم به این مشکل برخوردم که بخش‌هایی از پروژه نیاز به جمع آوری داده از بخش‌های مختلف ماژول‌ها داره.

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

  • مدیریت فایل
  • مدیریت کاربران
  • مدیریت محتوا

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

سعی کردم موضوع رو تحلیل کنم و دیدم یک گزینه‌ی منو این موارد رو شامل می‌شه:

  • عنوان
  • آیکن
  • آدرس لینک یا Route و پارامترهاش

و چند گزینه‌ی حاشیه‌ای دیگه البته. می‌بینید که می‌شه نگاه key => value رو به این منو داشت و چی بهتر از یه آرایه یا Collection برای مدیریت‌ش؟

کارم رو روی ساخت یک سرویس برای مدیریت این داده‌ها شروع کردم. چیزی که تو ذهنم بود چیزی به این شکل بود:

Menu::add($key, $value);

این اولین قدم بود، خیلی کار سختی نبود و سریع آماده شد. در قدم بعدی این امکانات رو اضافه کردم:

  • has()
  • delete()
  • get()
  • all()
  • edit()

تا اینجا می‌تونستم هر تعداد خواستم آیتم برای منو درست کنم، تو بلید مربوطه بگیرم‌ش و با یه حلقه‌ی ساده به منوی تر و تمیزی تبدیل کنم. همه چیزش هم خوب کار می‌کرد.

چرا همینجا تموم بشه؟

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

راه حل چی بود؟

برای حل این مسئله علاوه بر آرایه‌ی داده‌ها، متغیری اضافه کردم تا موقعیت فعلی انجام تغییرات رو نگه دارم. بعد از انجام تغییرات ایجاد یک گزینه‌ی منو به شکل زیر دراومد:

share()->menu()->item('dashboard')->label(‘پیشخوان’)->href('/admin/');

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

https://github.com/peyman3d/laravel-share

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

composer require peyman3d/laravel-share

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