Nette DI Container
A Nette DI a Nette egyik legérdekesebb könyvtára. Képes generálni és automatikusan frissíteni a lefordított DI konténereket, amelyek rendkívül gyorsak és elképesztően könnyen konfigurálhatók.
A DI konténer által létrehozandó szolgáltatások formáját általában konfigurációs fájlokban definiáljuk NEON formátumban. A konténer, amelyet manuálisan hoztunk létre az előző fejezetben, így íródna le:
parameters:
db:
dsn: 'mysql:'
user: root
password: '***'
services:
- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
- ArticleFactory
- UserController
A leírás valóban tömör.
Az ArticleFactory
és UserController
osztályok konstruktoraiban deklarált összes függőséget a
Nette DI maga kideríti és átadja az úgynevezett autowiring segítségével, ezért a konfigurációs fájlban
semmit sem kell megadni. Tehát még ha a paraméterek megváltoznak is, a konfigurációban semmit sem kell módosítani.
A Nette konténer automatikusan újragenerálódik. Ön így tisztán az alkalmazás fejlesztésére koncentrálhat.
Ha a függőségeket setterek segítségével szeretnénk átadni, használjuk a setup szekciót.
A Nette DI közvetlenül PHP kódot generál a konténerhez. Az eredmény tehát egy .php
fájl, amelyet
megnyithat és tanulmányozhat. Ennek köszönhetően pontosan láthatja, hogyan működik a konténer. Debuggolhatja is az
IDE-ben és lépésenként végigkövetheti. És ami a legfontosabb: a generált PHP rendkívül gyors.
A Nette DI képes factory kódot is generálni egy
megadott interfész alapján. Ezért az ArticleFactory
osztály helyett elég lesz csak egy interfészt létrehozni
az alkalmazásban:
interface ArticleFactory
{
function create(): Article;
}
A teljes példát megtalálja GitHubon.
Önálló használat
A Nette DI könyvtár bevezetése egy alkalmazásba nagyon egyszerű. Először telepítjük a Composerrel (mert a zip fájlok letöltése annyira elavult):
composer require nette/di
A következő kód létrehoz egy DI konténer példányt a config.neon
fájlban tárolt konfiguráció
alapján:
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp');
$class = $loader->load(function ($compiler) {
$compiler->loadConfig(__DIR__ . '/config.neon');
});
$container = new $class;
A konténer csak egyszer generálódik le, a kódja a cache-be íródik (a __DIR__ . '/temp'
könyvtárba), és a
további kéréseknél már csak innen töltődik be.
A szolgáltatások létrehozására és lekérésére a getService()
vagy a getByType()
metódusok
szolgálnak. Így hozunk létre egy UserController
objektumot:
$controller = $container->getByType(UserController::class);
$controller->someMethod();
Fejlesztés közben hasznos aktiválni az auto-refresh módot, amelyben a konténer automatikusan újragenerálódik, ha
bármelyik osztály vagy konfigurációs fájl megváltozik. Ehhez elég a ContainerLoader
konstruktorában második
argumentumként true
-t megadni.
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);
Használat a Nette keretrendszerrel
Ahogy bemutattuk, a Nette DI használata nem korlátozódik a Nette Frameworkben írt alkalmazásokra, mindössze 3 sor kóddal bárhol bevethető. Ha azonban alkalmazásokat fejleszt a Nette Frameworkben, a konténer konfigurálását és létrehozását a Bootstrap végzi.