Что такое макросы Laravel и как расширить основные классы Laravel с их помощью?

Макросы 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 и помогает избавиться от повторения одной и той же логики во всем приложении.

Рейтинг
( 4 оценки, среднее 3.75 из 5 )
Maxyc Webber/ автор статьи
Мне 35 лет. Опыт профессиональной разработки 15 лет. Занимаюсь разработкой и поддержкой корпоративных систем автоматизации бизнеса, а также высоконагруженными проектами. Мне нравится решать нестандартные проблемы бизнеса. Имею опыт формирования команд под проект, налаживания процесса разработки, коммуникации программистов и заказчиков. Есть опыт работы с зарубежными заказчиками (ОАЭ, Польша, Германия, Швейцария).
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.