A Laravel Manager pattern egy tiszta és skálázható megoldás több szolgáltató egységes kezelésére. A cikk bemutatja, hogyan készíthetünk konfigurálható számlázó driver rendszert Laravelben Billingo és PDF driverekkel. Az implementáció tartalmaz konfigurációs fájlt, interface-t, drivereket, managert, service provider regisztrációt és facade használatot. A pattern előnye, hogy egyszerűen bővíthető, könnyen konfigurálható és egységes API-t biztosít különböző szolgáltatókhoz.
Magyarországon több számlázó szolgáltatás is elérhető, például a Billingo vagy a Számlázz.hu. Sok projektben fontos szempont, hogy az ügyfél kiválaszthassa, melyik szolgáltatót szeretné használni.
Ahhoz, hogy a szolgáltatók közötti váltás egyszerű és konfigurálható legyen, a Laravel Manager pattern kiváló megoldás. A Laravel belsőleg is ezt a mintát használja például a cache, mail, queue vagy filesystem driverek kezelésére.
Ebben a cikkben megmutatom, hogyan készíthetünk egyszerű számlázó driver rendszert Laravel Manager használatával.
Konfigurációs fájl létrehozása
Hozzuk létre a config/invoice.php fájlt.
<?php
return [
/*
|--------------------------------------------------------------------------
| Alapértelmezett számlázó driver
|--------------------------------------------------------------------------
|
| Elérhető driverek: pdf, billingo
|
*/
'driver' => env('INVOICE_DRIVER', 'pdf'),
];
Ezután a .env fájlban egyszerűen kiválaszthatjuk az alapértelmezett drivert.
INVOICE_DRIVER=pdf
vagy
INVOICE_DRIVER=billingo
Driver Interface létrehozása
Hozzuk létre az interface-t itt: app/Drivers/InvoiceInterface.php.
<?php
namespace App\Drivers;
interface InvoiceInterface
{
public function create(array $data): mixed;
}
Az interface biztosítja, hogy minden driver ugyanazt az API-t használja.
Billingo Driver létrehozása
Hozzuk létre az app/Drivers/Billingo.php fájlt.
<?php
namespace App\Drivers;
class Billingo implements InvoiceInterface
{
public function create(array $data): mixed
{
// Számla létrehozása Billingo API segítségével
return true;
}
}
PDF Driver létrehozása
Hozzuk létre az app/Drivers/PDF.php fájlt.
<?php
namespace App\Drivers;
class PDF implements InvoiceInterface
{
public function create(array $data): mixed
{
// PDF számla generálása
return true;
}
}
Invoice Manager létrehozása
Hozzuk létre az app/Managers/InvoiceManager.php fájlt.
<?php
namespace App\Managers;
use App\Drivers\Billingo;
use App\Drivers\PDF;
use Illuminate\Support\Manager;
class InvoiceManager extends Manager
{
public function createBillingoDriver(): Billingo
{
return $this->container->make(Billingo::class);
}
public function createPdfDriver(): PDF
{
return $this->container->make(PDF::class);
}
public function getDefaultDriver(): string
{
return $this->config->get('invoice.driver');
}
}
A Manager osztály automatikusan kezeli a driverek feloldását a driver() metódus segítségével.
Például:
app('invoice')->driver('billingo');
belsőleg ezt fogja meghívni:
createBillingoDriver()
A Manager regisztrálása
Regisztráljuk a managert az app/Providers/AppServiceProvider.php fájlban.
<?php
namespace App\Providers;
use App\Managers\InvoiceManager;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->singleton('invoice', function ($app) {
return new InvoiceManager($app);
});
}
}
Facade létrehozása
Hozzuk létre az app/Facades/Invoice.php fájlt.
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
/**
* @method static mixed create(array $data)
* @method static mixed driver(string|null $driver = null)
*/
class Invoice extends Facade
{
protected static function getFacadeAccessor(): string
{
return 'invoice';
}
}
Használat
Mostantól bárhonnan használhatjuk a számlázó szolgáltatást az alkalmazásban.
use App\Facades\Invoice;
Invoice::create($data);
A Laravel automatikusan az alapértelmezett drivert fogja használni.
Driver váltás futásidőben
A drivert dinamikusan is módosíthatjuk.
Invoice::driver('billingo')->create($data);
vagy
Invoice::driver('pdf')->create($data);
Miért hasznos a Manager pattern?
A Manager pattern számos előnyt biztosít:
Egyszerű driver váltás
Központi konfiguráció
Tiszta absztrakciós réteg
Könnyen bővíthető architektúra
Jobb tesztelhetőség
Egységes API minden szolgáltatóhoz
Új számlázó szolgáltató hozzáadásához csak egy új driver osztályt kell létrehozni és regisztrálni a managerben.
Összegzés
A Laravel Manager pattern egy tiszta és skálázható megoldás több szolgáltató egységes kezelésére.
Különösen hasznos lehet:
Számlázó rendszereknél
Fizetési gateway-eknél
SMS szolgáltatóknál
Cloud storage szolgáltatóknál
Email szolgáltatóknál
Ha az alkalmazásod több, egymással felcserélhető szolgáltatót használ, akkor a Laravel Manager pattern kiváló választás lehet.