گسترش کالکشن‌های لاراول با استفاده از ماکروها

گردآوری و تالیف : رضا جمال زاده
تاریخ انتشار : 18 شهریور 1398
دسته بندی ها : لاراول

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

مفهوم ماکرو

 ماکرو یکی از ویژگی‌های قدرتمند لاراول است که به شما اجازه می‌دهد که توابع سفارشی شده را به اجزاء مختلف لاراول اضافه کنید. در مقاله های قبل به توضیح ماکروrequest و response پرداخته شد، در ادامه به توضیح چگونگی گسترش کالکشن‌ها با استفاده از ماکروها می‌پردازیم.

Collection::macro('name', function () {
    // Add functionality here
});

توجه: شما می‌توانید ماکروی خود را درAppServiceProviders یا هرserviceproviders  دیگری تعریف کنید.

همانطور که دیدید، ما کلمه‌ی name را به عنوان اولین پارامتر تعریف کردیم سپس ما یک تابع را به عنوان پارامتر دوم قرار دادیم، در ادامه ما می‌توانید به سادگی متد جدید خود را بر روی کالکشن استفاده کنیم:

$items = collect([1, 2, 3]);
$items->name();

تا این‌جا ما با اصول اولیه آشنا شدیم، در ادامه بیاید از یک مثال عینی‌تر استفاده کنیم.

پیاده سازی متد some() 

متد some() در جاوا اسکریپت برای کار با آرایه‌ها وجود دارد. این متد فقط یک کار را انجام می‌دهد، شرایط داده شده به آن را بررسی می‌کند اگر این شرایط حداقل با یک عنصر مطابقت داشت trueو در غیر این صورت false  را برمی‌گرداند.

بیاید به قسمت boot در AppServiceProvider خود برویم و متد زیر را پیاده سازی کنیم:

Collection::macro('some', function ($callback) {
    return !! $this->first(function ($value, $key) use ($callback) {
        return $callback($value, $key);
    });
});

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

collect([1, 2, 3, 4])->some(function ($value) {
    return $value > 2;
}); // true

collect([1, 2, 3, 4])->some(function ($value) {
    return $value > 5;
}); // false

collect([1, 2, 3, 4])->some(function ($value, $key) {
    return $key % 2 === 0;
}); // true

collect([1, 2, 3, 4])->some(function ($value, $key) {
    return $key === 'key';
}); // false

درک این موضوع مهم است که متدsome()  یک آیتم را به عنوان نتیجه برنمی‌گرداند بلکه فقط یک مقدار بولین را برمی‌گرداند.

 نتیجه گیری

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

منبع

مقالات پیشنهادی