ماکرو ها یک قابلیت جالب در لاراول هستند که کمتر به آن‌ها توجه شده است. حتی در مستندات لاراول هم فقط یک بار مختصر در بخش collection به آن اشاره کوچکی شده.

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

مثلا من می‌‌خواهم برای user یک سری روت تعریف کنم به این شکل:


Route::get('user/list'['App\Http\Controllers\UserController','List']);
Route::get('user/create'['App\Http\Controllers\UserController','Create']);
Route::get('user/edit',['App\Http\Controllers\UserController','Edit']);
Route::get('user/delete'['App\Http\Controllers\UserController','Delete']);

با استفاده از ماکروها می‌توانم این چهار خط کد را تبدیل به یک خط کنم.

داخل فایل appServiceProvider.php در متد boot ماکرو را تعریف می‌کنم.

  Route::macro('crud', function ($name) {
     $controllername = 'App\Http\Controllers\\' . ucfirst($name)     . 'Controller';
     Route::get("$name/list",[$controllername,'List']);
     Route::get("$name/create",  [$controllername,'Create']);
     Route::get("$name/edit",[$controllername,'Edit']);
     Route::get("$name/delete",[$controllername,'Delete']);
            });

به کلاس Route یک متد به نام macro می چسبانیم. بعد در پارامتر اول اسم متد دلخواه را می‌نویسیم. پارامتر دوم هم یک closure خواهد بود که عملکرد ماکرو اینجا نوشته می‌شود. در این مثال من یک اسم ($name) دریافت میکنم و در داخل آدرس هایی که تعریف می کنم جاگذاری می کنم.

الان ماکرو آماده استفاده است:

Route::crud('user');

اگر این ماکرو را در فایل web.php بنویسیم انگار که هر چهار route تعریف شده‌اند.

فرض کنید قرار است برای یک کنترلر دیگر مثلا tag، همین چهار route به همین شکل تعریف شود. در پارامتر ماکرو به جای user کافی است بنویسیم tag.

چه کلاس های قابلیت ماکرو نویسی را دارند؟

همه کلاس هایی که در لاراول دارای از trait به نام Macroable استفاده می کنند قابلیت تعریف ماکرو را دارند:

Response

Request

File

Cache

Route

Lang

URL

Illuminate\Cache\Repository

Illuminate\Console\Scheduling\Event

Illuminate\Database\Eloquent\Builder

Illuminate\Database\Eloquent\Relation

Illuminate\Database\Query\Builder

Illuminate\Filesystem\Filesystem

Illuminate\Foundation\Testing\TestResponse

Illuminate\Http\UploadedFile

Illuminate\Http\RedirectResponse

Illuminate\Http\Request

Illuminate\Routing\ResponseFactory

Illuminate\Routing\Router

Illuminate\Routing\UrlGenerator

Illuminate\Support\Arr

Illuminate\Support\Str

Illuminate\Support\Collection

Illuminate\Translation\Translator

Illuminate\Validation\Rule

کجا ماکرو را تعریف کنیم؟

ماکرو ها را می‌توانید در متد boot کلاس appServiceProvider یا ServiceProvider دلخواه خودتان تعریف کنید. فقط یادتان باشد seviceProvider را در فایل config/app.php اضافه کنید.