Макросы Laravel – это отличный способ расширить основные macroable классы Laravel и добавить дополнительную функциональность, необходимую для вашего приложения. Проще говоря, макрос Laravel – это подход к добавлению некоторых недостающих функций в основной компонент Laravel с помощью фрагмента кода, который не существует в классе Laravel. Для реализации макрос Laravel использует трейт Macroable. Вы можете посмотреть класс Illuminate\Http\Response
, он реализует трейт Macroable, который подразумевает, что вы можете расширить Illuminate\Http\Response класс с помощью статического метода macro.
Регистрация нового макроса
Все макросы должны быть зарегистрированы внутри boot метода в сервис провайдере. Вы можете создать отдельный сервис провайдер для макросов или добавить макросы напрямую в AppServiceProvider, поставляемую с установкой Laravel по умолчанию. Это полностью зависит от вас.
Использование анонимной функции
Этот подход является простым подходом к добавлению нового macro, помещая его только внутри метода AppServiceProvider::boot().
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Collection::macro('name it here', function(){
// Pass your actual code here.
});
}
}
И вы закончили.
Вот пример toUpper макроса:
use Illuminate\Support\Str;
Collection::macro('toUpper', function () {
return $this->map(function ($value) {
return Str::upper($value);
});
});
$collection = collect(['first', 'second']);
$upper = $collection->toUpper();
// ['FIRST', 'SECOND']
Использование mixins
Если вы захотите использовать много макросов из определенного класса Laravel, то в этой ситуации ваш boot метод сервис провайдера, скорее всего, сильно разрастется из-за различных макросов, и код начнет выглядеть беспорядочно.
Чтобы изолировать свой код, вы можете использовать mixins
.
Для этого подхода вы должны использовать статический метод mixin в macroable классе и передать свой mixin класс в качестве аргумента.
Давайте рассмотрим один пример. Допустим, у нас есть Macros/QueryBuilderMacros.php со следующим содержимым.
class QueryBuilderMacros
{
public function one()
{
// macro content
}
protected function two()
{
// macro content
}
private function three()
{
// will not become a macro
}
}
Следующий код является примером mixin для регистрации QueryBuilderMacros класса с его методами.
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Builder::mixin(new QueryBuilderMacros());
}
}
Вот и все. Методы QueryBuilderMacros ::one и ::two станет доступным на каждом Builder экземпляре класса. Метод ::three, объявленный как private, останется доступным только для методов в QueryBuilderMacros классе, вы знаете, так как private должен оставаться private.
Вывод
Макросы Laravel – это хороший компонент, который открывает множество мыслимых возможностей для расширения фреймворка Laravel и помогает избавиться от повторения одной и той же логики во всем приложении.