Service vrstva Doctrine (2/2)

Patrik Votoček

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í

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í

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í.

« »