ویرگول
ورودثبت نام
fouladgar.dev
fouladgar.dev
خواندن ۳ دقیقه·۵ سال پیش

Laravel Eloquent Filter (All in one)

تا حالا شده در پروژهای خود با پارامترهای زیادی برای ارسال به API روبرو شده باشید؟ و شما باید براساس آنها تعداد زیادی کوئری های پیچیده ای ایجاد کنید؟! پس اگر جواب شما مثبت هستش این مقاله را تا آخر دنبال کنید.


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

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


و حالا، اگر شما نخواهید ساختار پیش فرض لاراول را دنبال کنید راهکار برای ساخت فیلتر چیست؟


تعریف فیلتر برای هر Module/Domain

در یک پروژه کوچک شما میتوانید از معماری پیش فرض لاراول (MVC) استفاده کنید که ساختار دایرکتوری ها بصورت زیر می باشد:

. ├── app │ ├── Console ├── EloquentFilters // Default directory for filters │ └── Product │ ├── PriceMoreThanFilter.php │ └── User │ ├── AgeMoreThanFilter.php │ └── GenderFilter.php └── Exceptions │ ├── Http │ │ ├── Controllers │ │ ├── Middleware │ │ └── Requests │ └── Providers ├── bootstrap ├── config ├── database ├── public ├── resources ├── routes ├── storage

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

https://gist.github.com/mohammad-fouladgar/9e3472684bbe5e4d0e365195cd9fb0a7



اما زمانی که پروژه شما به مرور زمان بزرگ می شود، ساختار پیش فرض کافی نیست! درنهایت، شما مجبورید از معماری های متفاوتی (مانند Domain-Driven-Desgin, HMVC, …) استفاده کنید یا ساختار فعلی را تغییر دهید. به ساختار زیر توجه کنید:

. ├── app ├── bootstrap ├── config ├── database ├── Domains │ ├── Product │ │ ├── database │ │ │ └── migrations │ │ ├── src │ │ ├── Filters //Custom directory for Product model filters │ │ │ └── PriceMoreThanFilter.php │ │ ├── Entities │ │ ├── Http │ │ └── Controllers │ │ ├── routes │ │ └── Services │ ├── User │ │ ├── database │ │ │ └── migrations │ │ ├── src │ │ ├── Filters //Custom directory for User model filters │ │ │ └── AgeMoreThanFilter.php │ │ ├── Entities │ │ ├── Http │ │ └── Controllers │ │ ├── routes │ │ └── Services ...

در این اینجا از ساختار پیش فرض دایرکتوری لاراول استفاده نشده است.

این هفته، ورژن جدید EloquentBuilder منتشر شد. در این ورژن یک متد جدید بنام setFilterNamespace اضافه شد که به شما این قابلیت را می دهد که برای ”هر دامنه یا ماژول“ بصورت جداگانه filter namespace را تنظیم کنید.

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

https://gist.github.com/mohammad-fouladgar/23024b97f30b5cd053c2014262b71553

جمع بندی

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

https://github.com/mohammad-fouladgar/eloquent-builder



laraveleloquentfilteringeloquent builderphp
Back-End Developer
شاید از این پست‌ها خوشتان بیاید