ساخت فیلترهای جستجوی پیشرفته در لاراول


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



مشکل چیست؟

مشکل از اینجا شروع می شود که شما با مجموعه ای از فیلترها روبرو می شوید که برای اضافه کردن آنها به Query باید شرط های زیادی را برسی کنید.

نوشتن شرط های زیاد حتما از خوانایی کد شما می کاهد و روند توسعه را کُند و پیچیده می کند. همچنین, شما از فیلتر ها وشرط هایی که نوشتید فقط می توانید در یک حوزه استفاده کنید و قابل استفاده مجدد نیز نخواهند بود.

راه حل

شما باید کدهای خود را Refactor کنید !

برای رهایی از این مشکل باید کد خود را به روش Polymorphism برای جایگزین کردن شرط ها Refactor کنید.

برای آشنایی بیشتر این design pattern اینجا کلیک کنید.



مثال عملی

فرض کنید شما نیاز دارید لیست کاربرانی را با پارامترهای درخواستی زیر دریافت کنید:

http://virgool.io/users?age_more_than=25&gender=male&has_published_post=true

پارامتر های درخواستی به صورت زیر خواهند بود:

[
    'age_more_than'      => '25',
    'gender'             => 'male',
    'has_published_post' => 'true',
]

در روش معمولی ما بصورت زیر فیلتر ها را اعمال میکنیم:

https://gist.github.com/mohammad-fouladgar/ddd1564fb4e979f61c34a68a2746245c

دراینجا به ازای پارامتر های درخواستی, شرط هایی را برسی کردیم.

با اضافه شدن پارامترهای درخواستی, ما باید شرط های دیگری را جهت برسی و محدود کردن Query به تیکه کد بالا اضافه کنیم که تمیزی کد ما را ا بین می برد.




استفاده از پکیج Eloquent-Builder برای حل مشکل

بعد از نصب پکیج معرفی شده, تنها کافیست کد خود را به صورت زیر تغییر دهید:

https://gist.github.com/mohammad-fouladgar/4c37f0cc4a5e7df43f7335c35315412b

شما فقط کافیست مدل و لیست پارامترها را به متد to ارسال کنید.

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

به همین راحتی!

تعریف یک فیلتر:

برای نمونه من یکی از فیلترهای مثال بالا را پیاده سازی میکنم.به مثال زیر دقت کنید:

https://gist.github.com/mohammad-fouladgar/d9ea28c6e4088f450a1eef6b71b0f94c


برای مشاهده جزئیات بیشتر به آدرس پکیج در گیت هاب مراجعه کنید.

موفق باشید و ممنون بابت وقتی که گذاشتید.