به زبان ساده، ماکرو راهی برای توسعه کلاس های Core لاراولی هستن.
اجازه بدین با یک مثال توضیح بدم. فرض کنین شما به یک تابع نیاز دارین که یک رشته و یک عدد را دریافت کنه، درصورت برابر بود طول رشته با عدد وارد شده true و در غیر اینصورت false برگرداند. خب این قابلیت در کلاس Str وجود ندارد و اگر بخواهیم آنرا به این کلاس اضافه کنیم ماکروها درخدمت ما هستن.
برای ایجاد این ماکرو در متد boot در AppServiceProvider تکه کد زیر رو وارد کنین.
use Illuminate\Support\Str;
Str::macro('isLength', function ($str, $length) {
return static::length($str) == $length;
}
و حالا به راحتی متد isLength در کلاس Str در دسترس قرار میگیره.
Str::isLength('This is a Laravel Macro', 23);
حالا فرض کنید لیستی از مواردی که لازم دارید به کلاس Str اضافه کنید در اختیار دارین و میخواین اونا رو به سرویس پروایدر خودتون اضافه کنین. قطعا این هشدار در ذهنتون به وجود میاد که AppServiveProvider تون به سرعت طولانی و نامرتب میشه پس راه حل بعدی چیه؟
Mixin کلاس ها راهکاری جایگزین برای ایجاد ماکروها هستند. در این کلاس ها متدهایی با نام های مورد نظر خودتون تعریف کنید و خروجی اونا رو کلوژر هایی بذارید که عملیات های شما رو انجام میدن و سپس در AppServiceProvider کلاس Mixin رو به صورت زیر به کلاس Str اضافه کنین:
Str::mixin(new StrMixin);
کلاس Mixin شما هم به صورت زیر میشه:
class StrMixin
{
/**
* @return \Closure
*/
public function isLength()
{
return function($str, $length) {
return static::length($str) == $length;
};
}
/**
* @return \Closure
*/
public function appendTo()
{
return function($str, $char) {
return $char.$str;
};
}
}