Разработка пакета (package) для Laravel 4.2
Пакет может регистрировать несколько сервис-провайдеров.
Для начала нам понадобится чистая установка фреймворка Laravel 4.2 (так удобней):
composer create-project laravel/laravel NEW-EMPTY-DIR-NAME 4.2 --prefer-dist
Пропишите правило определения локального окружения (имя хоста) и укажите ваши name и email как разработчика пакета в файле app/config/local/workbench.php
.
Генерация базовой структуры нового пакета в каталоге workbench/
(будет создан, если не существует):
php artisan workbench vendor/package --resources
Параметр --resources
указывает, что для нового пакета нужно генерировать дополнительные каталоги для конфигов, контроллеров, моделей, миграций, assets-файлов..
Примечание
Если в workbench
конфиге вашего проекта не указаны name и email разработчика - вы получите исключение:
[Composer\Json\JsonValidationException]
"./composer.json" does not match the expected JSON schema:
- authors[0].email : Invalid email
Заготовка для нового пакета все же будет сгенерирована, но зависимость illuminate/support
не будет загружена в каталог с новым пакетом!
Примечание
При генерации пакета впервые, в момент загрузки зависимости illuminate/support
, вы можете получить запрос:
Could not fetch https://api.github.com/repos/illuminate/support/zipball/db61f3f6d507ce417ca993e1f93585db7efd8b12, enter your GitHub credentials to go over the API rate limit
A token will be created and stored in "/home/stas/.composer/auth.json", your password will never be stored
To revoke access to this token you can visit https://github.com/settings/applications
Просто укажите ваш логин/пароль чтобы сгенерить токен для последующего доступа к API GitHub.
Примечание
Laravel автоматически проверяет папку workbench/ на наличие пакетов, загружая их файлы при запуске приложения.
Подключите класс сервис-провайдера %Vendor%\%Package%\%Package%ServiceProvider
в секции providers
конфига app/config/app.php
.
Сгенерируйте повторно файлы автозагрузки:
php artisan dump-autoload
Сервис-провайдер пакета - это класс первичной инициализации пакета, в котором вы можете делать все, что нужно - регистрировать другие сервисы в IoC контейнере, подключать файлы с маршрутами, задавать обработчики событий. Подробнее смотрите в статье «Сервис-провайдеры в Laravel 4.2».
<?php
namespace MyVendorName\MyPackage;
use Illuminate\Support\ServiceProvider;
class MyPackageServiceProvider extends ServiceProvider
{
/**
* Отложенная загрузка сервисов этого провайдера (по запросу сервиса из IoC контейнера).
* Сервис-провайдер будет зарегистрирован при обращении к одному из предоставляемых пакетом сервисов, см. provides()
*/
protected $defer = false;
/**
* Регистрируем пакет. Задаем настройки пакета для получения ресурсов (конфиги, шаблоны)
*/
public function boot()
{
// Настройки пакета для доступа к его ресурсам
$this->package('MyVendorName/MyPackage', 'my-package'); // default resource namespace: MyPackage
// Пример доступа к ресурсам:
$template = View::make('my-package::directory.some-template');
$cfgValue = Config::get('my-package::cfg_key');
}
public function register()
{
// Регистрируем нужные нам сервисы, см. http://onedev.net/post/539
}
}
#package, #service providers, #plugin