Service vrstva Doctrine (2/2)
V předchozím článku jsem řešil, zda o data žádat přímo repository, či zda žádat service. V tomto článku bych rád otevřel diskusi nad dalším “problémem”, který řeším.
Dalším problémem je totiž “spárování” service s entitou. V doctrine si totiž entita sama říká, jaká repository se o ní má starat (čistotu tohoto řešení nechejme stranou). Je to jednoduché, zvyknete si na to a kupodivu je to i celkem praktické řešení. Jak tedy řešit svázání service s entitou. A jak toto svázání napasovat na Nette Framework?
Anotace + DoctrineContainer
Jednou z možností je využití anotace, stejně jako je tomu u repository. Zavedeme si tedy anotaci service. Ukázka kódu:
/**
* @entity
* @service(class="App\Model\FooService")
*/
class FooEntity extends \Nella\Doctrine\Entity
{
// ...
}
$service = $this->context->doctrineContainer->getService('App\Model\FooEntity');
Shrnutí
- + mám vše na jednom místě
- - entita “ví” , jaká služba jí zpracovává
Globální DI kontejner
Druhou možností je modelové služby registrovat, jako klasické služby do jednoho velkého “globálního” kontejneru. Opět ukázka
common:
services:
fooModelService: {class: 'App\Model\FooService'}
To byla registrace služby do kontejneru, teď se podívejme na použití.
$service = $this->context->fooModelService;
Shrnutí
- + entita nemá žádnou vazbu na službu
- - nutnost “složité” registrace služby do kontejneru
Které z těchto řešení zvolit a proč?
Pokud se ptáte proč jsem nepsal třetí možnost - a to využití doctrine kontejneru bez anotací (s registrací). Tak je to proto. že jsem nenašel smysl / důvod, proč by měl existovat další kontejner, když není ničím speciální.