Вступление
Пакеты являются основным способом добавления функциональности в Laravel. Пакеты могут быть отличным способом для работы с датами, такими как Carbon , или с целой средой тестирования BDD, такой как Behat .
Существуют разные типы пакетов. Некоторые пакеты являются автономными, то есть они работают с любой средой PHP. Carbon и Behat являются примерами автономных пакетов. Любой из этих пакетов можно использовать с Laravel, запросив их в вашем файле.composer.json
С другой стороны, другие пакеты специально предназначены для использования с Laravel. Эти пакеты могут иметь маршруты, контроллеры, представления и конфигурацию, специально предназначенные для улучшения приложения Laravel. Это руководство в первую очередь охватывает разработку тех пакетов, которые специфичны для Laravel.
Записка на фасадах
При написании приложения Laravel, как правило, не имеет значения, используете ли вы контракты или фасады, поскольку оба обеспечивают практически одинаковые уровни тестируемости. Однако при написании пакетов ваш пакет обычно не будет иметь доступа ко всем помощникам по тестированию Laravel. Если вы хотите иметь возможность писать свои тесты пакетов, как если бы они существовали в типичном приложении Laravel, вы можете использовать пакет Orchestral Testbench .
Обнаружение пакетов
В файле конфигурации приложения Laravel эта опция определяет список поставщиков услуг, которые должны быть загружены Laravel. Когда кто-то устанавливает ваш пакет, вы обычно хотите, чтобы ваш поставщик услуг был включен в этот список. Вместо того, чтобы требовать от пользователей ручного добавления вашего поставщика услуг в список, вы можете определить поставщика в разделе файла вашего пакета . Помимо поставщиков услуг, вы также можете перечислить любые фасады, которые вы хотели бы зарегистрировать:config/app.php
providers
extra
composer.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\ServiceProvider
register
boot
ServiceProvider
illuminate/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.line
courier
welcome
messages
echo trans('courier::messages.welcome');
Издательские переводы
Если вы хотите опубликовать переводы вашего пакета в каталог приложения , вы можете использовать метод поставщика услуг . Метод принимает массив путей пакетов и их нужных мест издают. Например, чтобы опубликовать файлы перевода для пакета, вы можете сделать следующее:resources/lang/vendor
publishes
publishes
courier
/**
* 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 , где мнения расположены. Вы можете сделать это, используя метод поставщика услуг loadViewsFrom
. loadViewsFrom
Метод принимает два аргумента: путь к шаблонам просмотра и имени вашего пакета. Например, если имя вашего пакета - courier
вы добавили бы следующее к boot
методу поставщика услуг :
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');
}
Ссылки на представления пакетов используются в соответствии с синтаксическим соглашением. Итак, как только ваш путь просмотра зарегистрирован у поставщика услуг, вы можете загрузить представление из пакета следующим образом:package::view
admin
courier
Route::get('admin', function () {
return view('courier::admin');
});
Переопределение пакетов
Когда вы используете loadViewsFrom
метод, Laravel фактически регистрирует два местоположения для ваших представлений: каталог приложения и каталог, который вы укажете. Итак, используя пример, Laravel сначала проверит, была ли предоставлена разработчиком пользовательская версия представления . Затем, если представление не было настроено, Laravel произведет поиск в каталоге представлений пакетов, который вы указали при вызове . Это позволяет пользователям пакета настраивать / переопределять представления вашего пакета.resources/views/vendor
courier
resources/views/vendor/courier
loadViewsFrom
Публикация просмотров
Если вы хотите сделать свои представления доступными для публикации в каталоге приложения , вы можете использовать метод поставщика услуг . Метод принимает массив просмотреть пакет путей и их желаемым публиковать место:resources/views/vendor
publishes
publishes
/**
* 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
0 комментариев