Pracování s Doctrinou v komponentě – inject \Kdyby\Doctrine\EntityManager

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kloban
Člen | 123
+
0
-

Ahoj,
rozhodl jsem se posunout v nette trošku dál a začít zkoumat a hlavně používat komponenty. Zaroveň jsem se rozhodl začít s \kdyby\Doctrine.

Postupuji podle začátečníckého návodu (http://blog.honzacerny.com/…te-framework) ve kterém se injectuje Doctrina pomocí anotace:

/**
 * @inject
 * @var \Kdyby\Doctrine\EntityManager
 */
public $EntityManager;

Problém je, že toto se v komponentě nedá použít. Byl jsem odkázán na dokumentaci (https://doc.nette.org/…dependencies#…), kde se řeší právě injectování do komponenty.
Metoda createComponent tedy má vypadat nějak takto:

/** @inject @var \App\Service1 */
private $service1;
protected function createCompoonentMyControl()
{
    $control = new MyControl($this->service1);
    return $control;
}

Problém je, že já mám ke komponentě vytvořené ještě rozhraní s metodou create. Proto moje metoda createComponent v presenteru vypadá takto:

 /**
 * @var \App\AdministrationModule\Components\Ctest\ICtestControlFactory
 * @inject
 */
 public $ctestControlFactory;

/**
 * Ctest control factory.
 * @return CtestControl
 */
 protected function createComponentCtest()
 {
     $control = $this->ctestControlFactory->create();
     return $control;

 }

Nevím tedy jak mohu docílit injectnutí EntityManageru.
Díky za rady, Dan.

akadlec
Člen | 1326
+
+3
-

a o inject metodě si slyšel? Případě o constructoru? Toto není o doctrině ale o používání služeb v komponentách.

class MyComponent extend \Nette\Application\UI\Control
{
	protected $coolService;

	protected $nextService;

	public function injectSomeService(\My\Cool\Service $coolService, \My\Other\Service $nextService)
	{
		$this->coolService = $coolService;

		$this->nextService = $nextService;
	}
}
class MyComponent extend \Nette\Application\UI\Control
{
	protected $coolService;

	protected $nextService;

	public function __construct(\My\Cool\Service $coolService, \My\Other\Service $nextService)
	{
		$this->coolService = $coolService;

		$this->nextService = $nextService;
	}
}

Případně je tady ještě extension Kdyby/Autowired která ti přínáší Syntax sugar i do komponent.

Editoval akadlec (15. 5. 2015 9:06)

kloban
Člen | 123
+
+1
-

Díky. Udělal jsem to pomocí konstruktoru.

Filip Procházka
Moderator | 4668
+
+2
-

@kloban konstruktor je rozhodně lepší řešení :)