Створення простого пакету Laravel

Матеріал побудований на основі детального опису створення пакету за посилання 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.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *