Данная статья является первой и вступительной частью о разработке пакетов для Laravel. В этой (первой части) я постараюсь показать как достаточно просто можно создать пакет. При этом, постараюсь показать это на примере создания пакета для управления правами доступа (ACL — Access Control List). В данной части буду создавать структуру пакета, а в дальнейшем расширять.
Если вы загляните в папку vendor то увидите что пакеты «разложены» в виде имя-поставщика/название-пакета (vendor-name/package-name). Все это для удобства публикации ваших пакетов в публичных источниках типа packagist.org. Т.к. этот пакет мы еще только создаем и он еще не готов к публикации то выполним
1 |
mkdir -p packages/Bitw/Acl && cd packages/Bitw/Acl |
где packages — папка для разрабатываемых пакетов, Bitw — так я себя обозвал как поставщика и Acl — это название пакета. Так мы создадим папку нашего пакета и перейдем в нее.
Теперь пришло время воспользоваться composer для первичной настройки нашего пакета. Нам необходимо добавить некоторые инструкции для того, что бы автозагрузчик приложения знал где искать файлы нашего пакета и некоторую информацию об авторе пакета, а также там можно подключать другие пакеты указав их в списке зависимостей. Выполним
1 |
composer init |
и ответим на некоторые вопросы. В моем случае получилось так
теперь нам надо немного подкорректировать получившийся файл composer.json. Добавим секцию автозагрузки
1 2 3 4 5 6 7 8 |
... "autoload": { "classmap": [], "files": [], "psr-4": { "Bitw\\Acl": "src/" } } |
создадим папку mkdir src в которой чуть позднее мы создадим сервис-провайдер нашего пакета, а также будет там реализовывать всю необходимую логику пакета.
Остался последний штрих — указать автозагрузчику где искать файлы нашего пакета. Для этого отредактируем composer.json который находится в корне нашего проекта. В секцию autoload > psr-4 необходимо добавить "Bitw\\Acl\\": "packages/Bitw/Acl/src" сохранить изменения и выполнить из корня проекта composer dump-autoload .
Пришло время создать сервис-провайдер нашего пакета и зарегистрировать его в нашем приложении. Создадим packages/Bitw/Acl/src/AclServiceProvider.php с содердимым
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace Bitw\Acl; use Illuminate\Support\ServiceProvider; class AclServiceProvider extends ServiceProvider { public function register() { $this->app->bind('acl', function () { return new Acl; }); } } |
и зарегистрируем его в конфигурации нашего приложения config/app.php. Добавим
1 |
Bitw\Acl\AclServiceProvider::class, |
в список провайдеров.
Настало время создать контроллер.
1 2 |
mkdir -p packages/Bitw/Acl/src/Http/Controllers touch packages/Bitw/Acl/src/Http/Controllers/AclController.php |
содержимое контроллера AclController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php namespace Bitw\Acl\Http\Controllers; use App\Http\Controllers\Controller; class AclController extends Controller { public function index() { return response("Hello! This is Acl package."); } } |
Создадим файл с роутами touch packages/Bitw/Acl/src/Http/routes.php
1 2 3 4 5 6 7 |
<?php Route::group(['prefix' => 'acl', 'namespace' => 'Bitw\Acl\Http\Controllers'], function () { Route::get('/', ['as' => 'acl.index', 'uses' => 'AclController@index']); }); |
Чтоб добавить маршруты в загрузку необходимо поправить сервис-провайдер AclServiceProvider.php.
Добавам метод boot
1 2 3 |
public function boot(){ require __DIR__ . '/Http/routes.php'; } |
Для данной статьи я развернул на локальной машине домен acl.dev. В результате если в браузере набрать http://acl.dev/acl то увидим
1 |
Hello! This is Acl package. |
На этом я завершаю первую часть.
Очень доходчиво, спасибо. Хочется продолжения в таком же духе.