Итак, начнём. Сперва установим Laravel.
laravel new Packages
Теперь создадим папку для пакетов в корне проекта. Назовём её packages. Внутри этой папки создадим папку поставщика/разработчика - её имя - твой ник на github. После создадим папку пакета example и папку исходных фалов src. Кстати, чтобы лучше разобраться с политике формирования каталогов почитайте о стандартах PSR.
packages/zogxray/example/src
Создадим сервис-провайдер нашего пакета в папке src. В методе boot мы подключаем роутер и файлы шаблонов. О методе register лучше всего почитать в исходниках Alaouy/Youtube. Здесь этот метод носит декоративный характер.
namespace Zogxray\Example;
use Illuminate\Support\ServiceProvider;
class ExampleServiceProvider extends ServiceProvider {
public function boot(){
require_once __DIR__.'/Http/routes.php';
$this->loadViewsFrom(__DIR__.'/Views', 'example');
}
public function register()
{
$this->app['example'] = $this->app->share(function(){
return new Example;
});
}
}
Добавим классы пакета в автозагрузку Laravel отредактировав composer.json в секции автозагрузки.
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/",
"Zogxray\\Example\\": "packages/zogxray/example/src"
}
},
Обновим загруженные классы. Можно использовать команды dump-autoload и dumpautoload.
composer dumpautoload
Теперь добавим наш провайдер в массив провайдеров Laravel - это здесь config/app.php.
Zogxray\Example\ExampleServiceProvider::class,
Далее добавляем роут (src/Http/router.php), контролёр (src/Http/Controllers/ExampleController.php) и шаблон (src/Views/index.blade.php). Параметр namespace объясняет приложению где искать наш контроллер.
Route::group(['namespace'=>'Zogxray\Example\Http\Controllers', 'prefix' => 'example'], function() {
Route::get('/','ExampleController@index');
});
А вот контроллер. Обратите внимание на пространство имён контроллера и пространство имён при вызове шаблона, которое мы регистрировали в методе boot сервис-провайдера.
namespace Zogxray\Example\Http\Controllers;
use Illuminate\Routing\Controller;
class ExampleController extends Controller {
public function index() {
return view('example::index');
}
}
Ну и шаблон сделаем простой:
<h1>Laravel Example Package</h1>
Окей. Теперь наш пакет работает и выводит «Laravel Example Package» по сслыке http://sitename/example.
Удивим мир этим чудесным функционалом. В терминале перейдём в папку пакета packages/zogxray/example/ и выполним команду composer init.
После заполнения полей и небольшого редактирования файл должен выглядеть так:
{
"name": "zogxray/example",
"description": "Laravel Example Package",
"keywords":["laravel","demo"],
"license": "MIT",
"authors": [
{
"name": "Viktor Pavlov",
"email": "zogxray@gmail.com"
}
],
"minimum-stability": "dev",
"require": {},
"autoload": {
"psr-4": {
"Zogxray\\Example\\": "src/"
}
}
}
Теперь создаём репозиторий GitHub, загружаем наш пакет, а после регистрируем этот репозиторий на сайте Packagist.
git init
git add .
git commit -m "First commit"
git remote add origin git@github.com:zogxray/laravel-example-package.git
git push -u origin master
git tag -a 1.0.0 -m “First version”
git push --tags
Отлично. Теперь в любой проект на Laravel мы можем добавить наш пакет при помощи одной команды.
composer require zogxray/example