ماکرو ها یک قابلیت جالب در لاراول هستند که کمتر به آنها توجه شده است. حتی در مستندات لاراول هم فقط یک بار مختصر در بخش 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 اضافه کنید.