Матеріал побудований на основі детального опису створення пакету за посилання Creating a Laravel specific package. Для швидкої генерації пакету використовуйте Laravel Package Boilerplate.
Проісталюємо Laravel у визначену директорію
$ composer create-project --prefer-dist laravel/laravel directory-name
$ chmod -R 0777 storage
Створимо директорію для розробки пакетів vendor-dev, в якій створимо пакет mkuzmych/zabbixlaravel/
Базова структура проекту
- config
- src
- tests
.gitignore
CHANGELOG.md
README.md
LICENSE.md
composer.json
Ініціалізуємо налаштування пакету (composer.json)
$ composer init
{
"name": "mkuzmich/zabbixlaravel",
"description": "This package provides a Zabbix API library for Laravel",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "Mykola Kuzmich",
"email": "ua.pixart@gmail.com"
}
],
"minimum-stability": "dev"
}
Проінсталюємо залежність в наш пакет
$ composer require "mkuzmych/zabbix"
"require": {
"mkuzmych/zabbix": "^1.0"
},
Також додамо автоматичне завантаження класів в composer.json та для Laravel автодіскавері(providers) та аліас для нашого Facade:
"autoload": {
"psr-4": {
"Mkuzmych\\Zabbixlaravel\\": "src"
}
},
"extra": {
"laravel": {
"providers": [
"Mkuzmych\\Zabbixlaravel\\ZabbixlaravelServiceProvider"
],
"aliases": {
"Zabbixlaravel": "Mkuzmych\\Zabbixlaravel\\ZabbixlaravelFacade"
}
}
}
Налаштування проекту
Додамо в кореневий проект репозиторій нашого пакету для можливості локальної розробки:
// composer.json
"repositories": [
{
"type": "path",
"url": "vendor-dev/mkuzmych/zabbixlaravel"
}
]
Після цього можемо проінсталювати наш пакет:
$ composer require mkuzmich/zabbixlaravel
Using version dev-master for mkuzmich/zabbixlaravel
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
- Installing mkuzmych/zabbix (v1.0.1): Loading from cache
- Installing mkuzmich/zabbixlaravel (dev-master): Symlinking from vendor-dev/mkuzmych/zabbixlaravel
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/tinker
Discovered Package: mkuzmich/zabbixlaravel
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
Створення Service Providers та концігураційого файлу
В корені проекту створюємо сервіс провайдер – буде створено в app/Providers. Тепер перенесемо файл в наш пакет в директорію vendor-dev/mkuzmych/zabbix-laravel/src/ і міняємо namespace на Mkuzmych\Zabbixlaravel
// src/ZabbixlaravelServiceProvider.php
<?php
namespace Mkuzmych\Zabbixlaravel;
use Illuminate\Support\ServiceProvider;
class ZabbixlaravelServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*/
public function boot()
{
$this->publishes([
__DIR__.'/../config/zabbix.php' => config_path('zabbix.php')
], 'config');
}
/**
* Register the application services.
*/
public function register()
{
// Automatically apply the package configuration
$this->mergeConfigFrom(__DIR__.'/../config/zabbix.php', 'zabbix');
// Register the main class to use with the facade
$this->app->singleton('zabbixlaravel', function () {
return new Zabbixlaravel;
});
}
}
Конфігураційний файл створимо config/zabbix.php з необхідним параметрами:
<?php
return [
'apiurl' => env('ZABBIX_APIURL', null),
];
Відтепер файл конфігурації можна опублікувати:
php artisan vendor:publish --provider="Mkuzmych\Zabbixlaravel\ZabbixlaravelServiceProvider"
Перевірку доступності створеного провайдера можна здійснити в будь-якому місці проекту:
$zabbix = new \Mkuzmych\Zabbixlaravel\ZabbixlaravelServiceProvider($app);
dd($zabbix);
Facades
Зробимо доступним використання створеного нами класу Zabbixlaravel доступним як facade.
Створимо власне файл нашого класу:
// src/Zabbixlaravel.php
<?php
namespace Mkuzmych\Zabbixlaravel;
class Zabbixlaravel
{
private $api;
public function __construct(){
$this->api = new \Zabbix\Zabbix(config('zabbix.apiurl'),config('zabbix.user'),config('zabbix.password'),config('zabbix.httpuser'),config('zabbix.httppassword'),config('zabbix.authToken'),config('zabbix.streamcontext'));
}
/**
* Get auth tken for request
*/
public function getAuthToken(string $authToken = null)
{
return $this->api->getAuthToken($authToken);
}
}
Додаткового до цього класу ми повинні створити facade:
// src/ZabbixlaravelFacade.php
<?php
namespace Mkuzmych\Zabbixlaravel;
use Illuminate\Support\Facades\Facade;
/**
* @see \Mkuzmych\Zabbixlaravel\Skeleton\SkeletonClass
*/
class ZabbixlaravelFacade extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'zabbixlaravel';
}
}
Відтепер facade Zabbixlaravel може бути використаний Вами у будь-якому місці свого коду, для нього раніше ми вже прописали аліас на Mkuzmych\Zabbixlaravel\ZabbixlaravelFacade та здійснили його binding в Service Provider.