Вступление

Пакеты являются основным способом добавления функциональности в Laravel. Пакеты могут быть отличным способом для работы с датами, такими как Carbon , или с целой средой тестирования BDD, такой как Behat .

Существуют разные типы пакетов. Некоторые пакеты являются автономными, то есть они работают с любой средой PHP. Carbon и Behat являются примерами автономных пакетов. Любой из этих пакетов можно использовать с Laravel, запросив их в вашем файле.composer.json

С другой стороны, другие пакеты специально предназначены для использования с Laravel. Эти пакеты могут иметь маршруты, контроллеры, представления и конфигурацию, специально предназначенные для улучшения приложения Laravel. Это руководство в первую очередь охватывает разработку тех пакетов, которые специфичны для Laravel.

 

Записка на фасадах

При написании приложения Laravel, как правило, не имеет значения, используете ли вы контракты или фасады, поскольку оба обеспечивают практически одинаковые уровни тестируемости. Однако при написании пакетов ваш пакет обычно не будет иметь доступа ко всем помощникам по тестированию Laravel. Если вы хотите иметь возможность писать свои тесты пакетов, как если бы они существовали в типичном приложении Laravel, вы можете использовать пакет Orchestral Testbench .

 

Обнаружение пакетов

В файле конфигурации приложения Laravel эта опция определяет список поставщиков услуг, которые должны быть загружены Laravel. Когда кто-то устанавливает ваш пакет, вы обычно хотите, чтобы ваш поставщик услуг был включен в этот список. Вместо того, чтобы требовать от пользователей ручного добавления вашего поставщика услуг в список, вы можете определить поставщика в разделе файла вашего пакета . Помимо поставщиков услуг, вы также можете перечислить любые фасады, которые вы хотели бы зарегистрировать:config/app.phpprovidersextracomposer.json

"extra": {
    "laravel": {
        "providers": [
            "Barryvdh\\Debugbar\\ServiceProvider"
        ],
        "aliases": {
            "Debugbar": "Barryvdh\\Debugbar\\Facade"
        }
    }
},

Как только ваш пакет будет настроен для обнаружения, Laravel автоматически зарегистрирует своих поставщиков услуг и фасады, когда он будет установлен, создавая удобный процесс установки для пользователей вашего пакета.

Отказ от обнаружения пакета

Если вы являетесь потребителем пакета и хотите отключить обнаружение пакета для пакета, вы можете указать имя пакета в extraразделе файла вашего приложения :composer.json

"extra": {
    "laravel": {
        "dont-discover": [
            "barryvdh/laravel-debugbar"
        ]
    }
},

Вы можете отключить обнаружение пакетов для всех пакетов, используя *символ внутри директивы вашего приложения :dont-discover

"extra": {
    "laravel": {
        "dont-discover": [
            "*"
        ]
    }
},

 

Поставщики услуг

Поставщики услуг являются точками соединения между вашим пакетом и Laravel. Поставщик услуг отвечает за связывание вещей в сервисный контейнер Laravel и информирование Laravel, куда загружать ресурсы пакета, такие как представления, файлы конфигурации и локализации.

Поставщик услуг расширяет класс и содержит два метода: и . Базовый класс находится в пакете Composer, который вы должны добавить к зависимостям вашего собственного пакета. Чтобы узнать больше о структуре и назначении поставщиков услуг, ознакомьтесь с их документацией.Illuminate\Support\ServiceProviderregisterbootServiceProviderilluminate/support

 

Ресурсы

Конфигурация

Как правило, вам нужно будет опубликовать файл конфигурации вашего пакета в собственном configкаталоге приложения. Это позволит пользователям вашего пакета легко переопределять параметры конфигурации по умолчанию. Чтобы разрешить публикацию ваших файлов конфигурации, вызовите publishesметод из bootметода вашего поставщика услуг:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    $this->publishes([
        __DIR__.'/path/to/config/courier.php' => config_path('courier.php'),
    ]);
}

Теперь, когда пользователи вашего пакета выполнят команду Laravel , ваш файл будет скопирован в указанное место публикации. После того, как ваша конфигурация опубликована, к ее значениям можно получить доступ, как и к любому другому файлу конфигурации:vendor:publish

$value = config('courier.option');

Вы не должны определять замыкания в ваших файлах конфигурации. Они не могут быть правильно сериализованы, когда пользователи выполняют команду Artisan.config:cache

Конфигурация пакета по умолчанию

Вы также можете объединить свой собственный файл конфигурации пакета с опубликованной копией приложения. Это позволит вашим пользователям определять только те параметры, которые они на самом деле хотят переопределить в опубликованной копии конфигурации. Чтобы объединить конфигурации, используйте mergeConfigFromметод в методе вашего поставщика услуг register:

/**
 * Register bindings in the container.
 *
 * @return void
 */
public function register()
{
    $this->mergeConfigFrom(
        __DIR__.'/path/to/config/courier.php', 'courier'
    );
}

Этот метод объединяет только первый уровень массива конфигурации. Если ваши пользователи частично определяют многомерный массив конфигурации, отсутствующие параметры не будут объединены.

 

Маршруты

Если ваш пакет содержит маршруты, вы можете загрузить их, используя loadRoutesFromметод. Этот метод автоматически определяет, кэшируются ли маршруты приложения, и не загружает файл маршрутов, если маршруты уже были кэшированы:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    $this->loadRoutesFrom(__DIR__.'/routes.php');
}

 

Миграции

Если ваш пакет содержит миграции баз данных , вы можете использовать loadMigrationsFromметод, чтобы сообщить Laravel, как их загрузить. loadMigrationsFromМетод принимает путь к миграции вашего пакета в качестве единственного аргумента:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    $this->loadMigrationsFrom(__DIR__.'/path/to/migrations');
}

Как только миграции вашего пакета будут зарегистрированы, они будут автоматически выполняться при выполнении php artisan migrateкоманды. Вам не нужно экспортировать их в главный каталог приложения.database/migrations

 

Переводы

Если ваш пакет содержит файлы перевода , вы можете использовать loadTranslationsFromметод, чтобы сообщить Laravel, как их загрузить. Например, если ваш пакет назван courier, вы должны добавить следующее в bootметод вашего поставщика услуг :

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    $this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier');
}

На переводы пакетов ссылаются, используя синтаксическое соглашение. Итак, вы можете загрузить строку пакета из файла следующим образом:package::file.linecourierwelcomemessages

echo trans('courier::messages.welcome');

Издательские переводы

Если вы хотите опубликовать переводы вашего пакета в каталог приложения , вы можете использовать метод поставщика услуг . Метод принимает массив путей пакетов и их нужных мест издают. Например, чтобы опубликовать файлы перевода для пакета, вы можете сделать следующее:resources/lang/vendorpublishespublishescourier

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    $this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier');

    $this->publishes([
        __DIR__.'/path/to/translations' => resource_path('lang/vendor/courier'),
    ]);
}

Теперь, когда пользователи вашего пакета выполнят команду Artisan от Laravel , переводы вашего пакета будут опубликованы в указанном месте публикации.vendor:publish

 

Просмотры

Для регистрации своего пакета, открывается вид с Laravel, вы должны сказать Laravel , где мнения расположены. Вы можете сделать это, используя метод поставщика услуг loadViewsFromloadViewsFromМетод принимает два аргумента: путь к шаблонам просмотра и имени вашего пакета. Например, если имя вашего пакета - courierвы добавили бы следующее к bootметоду поставщика услуг :

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');
}

Ссылки на представления пакетов используются в соответствии с синтаксическим соглашением. Итак, как только ваш путь просмотра зарегистрирован у поставщика услуг, вы можете загрузить представление из пакета следующим образом:package::viewadmincourier

Route::get('admin', function () {
    return view('courier::admin');
});

Переопределение пакетов

Когда вы используете loadViewsFromметод, Laravel фактически регистрирует два местоположения для ваших представлений: каталог приложения и каталог, который вы укажете. Итак, используя пример, Laravel сначала проверит, была ли предоставлена ​​разработчиком пользовательская версия представления . Затем, если представление не было настроено, Laravel произведет поиск в каталоге представлений пакетов, который вы указали при вызове . Это позволяет пользователям пакета настраивать / переопределять представления вашего пакета.resources/views/vendorcourierresources/views/vendor/courierloadViewsFrom

Публикация просмотров

Если вы хотите сделать свои представления доступными для публикации в каталоге приложения , вы можете использовать метод поставщика услуг . Метод принимает массив просмотреть пакет путей и их желаемым публиковать место:resources/views/vendorpublishespublishes

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');

    $this->publishes([
        __DIR__.'/path/to/views' => resource_path('views/vendor/courier'),
    ]);
}

Теперь, когда пользователи вашего пакета выполнят команду Artisan от Laravel , представления вашего пакета будут скопированы в указанное место публикации.vendor:publish

Команды

Чтобы зарегистрировать команды Artisan вашего пакета в Laravel, вы можете использовать commandsметод. Этот метод ожидает массив имен классов команд. После того как команды зарегистрированы, вы можете выполнить их с помощью Artisan CLI :

/**
 * Bootstrap the application services.
 *
 * @return void
 */
public function boot()
{
    if ($this->app->runningInConsole()) {
        $this->commands([
            FooCommand::class,
            BarCommand::class,
        ]);
    }
}

 

Общественные активы

Ваш пакет может содержать ресурсы, такие как JavaScript, CSS и изображения. Чтобы опубликовать эти активы в publicкаталоге приложения , используйте метод поставщика услуг publishes. В этом примере мы также добавим publicтег группы активов, который можно использовать для публикации групп связанных ресурсов:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    $this->publishes([
        __DIR__.'/path/to/assets' => public_path('vendor/courier'),
    ], 'public');
}

Теперь, когда пользователи вашего пакета выполнят команду, ваши активы будут скопированы в указанное место публикации. Поскольку вам обычно нужно перезаписывать ресурсы каждый раз, когда пакет обновляется, вы можете использовать флаг:vendor:publish--force

php artisan vendor:publish --tag=public --force

 

Публикация файловых групп

Возможно, вы захотите опубликовать группы ресурсов и ресурсов пакета отдельно. Например, вы можете разрешить своим пользователям публиковать файлы конфигурации вашего пакета без необходимости публиковать ресурсы вашего пакета. Вы можете сделать это, пометив их тегами при вызове publishesметода от поставщика услуг пакета. Например, давайте использовать теги для определения двух групп публикации в bootметоде поставщика услуг пакета:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    $this->publishes([
        __DIR__.'/../config/package.php' => config_path('package.php')
    ], 'config');

    $this->publishes([
        __DIR__.'/../database/migrations/' => database_path('migrations')
    ], 'migrations');
}

Теперь ваши пользователи могут публиковать эти группы отдельно, ссылаясь на свой тег при выполнении команды:vendor:publish

php artisan vendor:publish --tag=config