Части
перейти к части...
Мы закончили разработку простейшего пакета для Laravel 5. Теперь давайте поговорим о разработке более сложных пакетов, которые включают в себя контроллеры, view, модели, маршруты, миграции БД, файлы конфигурации, и middleware. За основу возьмем код, который мы написали в первой части этого урока.
К сожалению, тестирование более сложного функционала вне проекта Laravel не очень удобно. К счастью, мы можем включить наш локально разрабатываем пакет в реальный проект. Поэтому, давайте создадим новый проект (или вы можете использовать любой уже существующий проект). Откройте composer.json
проекта и добавьте туда кусок кода ниже. Замените имя пакета и путь до него на ваши.
"repositories": {
"имя-вашего-вендора/имя-вашего-пакета": {
"type": "path",
"url": "относительный/или/абсолютный/путь/до/вашего/пакета",
"options": {
"symlink": true
}
}
}
Затем, выполните команду в терминале:
composer require имя-вашего-вендора/имя-вашего-пакета @dev
С этого момента любые локальные изменения в данном пакете будут сразу же доступны в проекте без каких-либо дополнительных действий.
Middleware
Чтобы добавить middleware в свой пакет, создайте папку с названием Middleware
в папке src
. На самом деле эта папка может называться как угодно, но мы будем придерживаться стандартных названий.
Создайте файл middleware в новой папке. Самый простой способ это сгенерировать middleware в Laravel через artisan и скопировать код оттуда. Не забудьте переименовать пространство имен middleware на ВашВендор\ВашПакет\Middleware
Разработка middleware в пакете ничем не отличается от разработки middleware в проекте Laravel. Чтобы использовать middleware из пакета в проекте, зарегистрируйте его в файле app/Http/Kernel.php
как обычно, например:
protected $middlewareGroups = [
'web' => [
...
\ВашВендор\ВашПакет\Middleware\ВашMiddleware::class,
],
...
];
Файлы миграций БД
Чтобы включить файлы миграций в ваш пакет, создайте папку database/migrations
в папке src
. Опять же, имя папки не обязательно должно быть таким. Внутри папки вы можете создать обычные файлы миграций Laravel. Задавайте своим таблицам префикс, чтобы избежать возможных конфликтов с существующими таблицами пользователей вашего пакета.
Далее, откройте сервис-провайдер пакета и добавьте метод boot
в класс. Внутри метода вызовите метод $this->loadMigrationsFrom()
, в качестве параметра передайте путь до папки с миграциями. Благодаря этому миграции вашего пакета будут вызываться вместе с остальными миграциями проекта, когда выполняется команда php artisan migrate
.
/**
* Выполняет загрузку сервисов после регистрации.
*
* @return void
*/
public function boot()
{
$this->loadMigrationsFrom(__DIR__ . '/database/migrations');
}
Модели
Создайте произвольную папку для хранения моделей, например src/Model
. Внутри вы можете создать обычные модели Laravel - классы, которые наследуются от Illuminate\Database\Eloquent\Model
. Опять же не забудьте указать правильное пространство имен.
Файлы конфигурации
Как и со всем остальным, создайте новую папку, например src/config
. Создайте новый файл конфигурации с произвольным именем, например your_package_name.php
. Файл конфигурации это просто php файл, который возвращает ассоциативный массив со значениями.
Затем откройте файл сервис-провайдера пакета. Добавьте следующий код в метод register
для того, чтобы получить возможность вытаскивать значения из файла конфигурации внутри самого пакета.
if ($this->app->config->get('your_config_file') === null) {
$this->app->config->set('your_config_file', require __DIR__ . '/config/your_config_file.php');
}
Наверняка вы хотели бы дать возможность пользователям вашего пакета редактировать файлы конфигурации, чтобы они могли изменять какие-то настройки. Для этого добавьте код ниже в метод boot
. Мы уже затрагивали этот метод в разделе о миграциях БД.
$this->publishes([
__DIR__ . '/config/your_config_file.php' => config_path('your_config_file.php'),
]);
Теперь, если пользователь выполнит команду php artisan vendor:publish ...
в своем проекте, файлы конфигурации вашего пакета будут скопированы в папку в проекте, в которой он сможет их редактировать.
Маршруты
Создайте файл маршрута в любой папке, например src/routes.php
. Добавьте маршруты как обычно. Чтобы проекты с вашим пакетом автоматически подключали ваши маршруты, добавьте следующее в метод register
сервис-провайдера:
$this->loadRoutesFrom(__DIR__ . '/routes.php');
Альтернативный подход
Не создавайте файл с машрутами и не добавляйте строчку кода выше в сервис-провайдер. Вместо этого создайте метод routes
в главном файле/классе вашего пакета. Например:
class YourMainClass
{
public static function routes()
{
Route::get('/my-route', function () {
return 'A route from the class!';
});
}
}
Таким образом маршруты из вашего пакета не будут загружены автоматичски. Пользователям придется самим добавлять следующую строчку в файл маршрутов проекта:
YourMainClass::routes();
Казалось бы, это менее удобно, но зато это дает больше контроля пользователям. Теперь они смогут оберунть ваши маршруты в группу с middleware, префиксом, и т.п., например:
Route::middleware('auth')->prefix('admin')->group(function () {
YourMainClass::routes();
});
Контроллеры
Создайте файл контроллера в любой папке, например src/Controllers/ExampleController.php
. Это будет обычный класс, мы не будем наследоваться от родительского Controller
как это делается в контроллерах Laravel. Создайте любой метод в новом контроллере, например метод test
, который возвращает строку.
<?php
namespace YourVendor\YourPackage\Controllers;
class ExampleController
{
public function test()
{
return 'Привет из контроллера';
}
}
Теперь вы можете привязать этот метод к маршруту своего пакета. Чтобы Laravel нашел ваш контроллер, придется указывать полный путь до класса начиная со слеша.
Route::get('/my-route', '\ВашВендор\ВашПакет\Controllers\ExampleController@test');
View
Наконец, создайте папку для view, например src/views
. Дайте Laravel знать, где хранятся view вашего пакета, добавив следующую строчку в метод boot
сервис-провайдера:
$this->loadViewsFrom(__DIR__ . '/views', 'yourpackage');
Теперь ваши view доступны внутри пакета:
view('yourpackage::your_view');
Вместо yourpackage
вы можете указать любую строчку.
Заключение
Мы рассмотрели основные моменты разработки composer пакетов для Laravel. Наверняка все оказалось не так сложно, как вы думали, просто нужно знать откуда начать. Не забывайте задавать правильные пространства имен классам в соответствие с псевдонимами, которые вы указали в composer.json
и с папками, в которых расположены файлы - это очень важно. Советую также дополнительно ознакомиться с документацией Laravel на данную тему.
Все материалы на сайте voerro абсолютно бесплатны и написаны автором в свободное от основной работы время. Если уроки сайта оказались для вас полезными, пожалуйста, помогите проекту. Спасибо!