Použitie továrničky v presenteri

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

Cafte páni,

prešiel som x postov, tutoriálov a stále nerozumiem tomu, ako mám používať továrničky.

Pomocou továrničky som chcel spraviť takúto jednoduchú vec:

V presenteri chcem poslať mail. Vytvorím inštanciu triedy Nette\Mail\Message, no treba zadefinovať meno a email odosielateľa, ktoré je niekde v configu. Takže ma nadlo spraviť si na to továrničku, ktorá mi vráti novú inštanciu triedy Nette\Mail\Message s nadefinovaným odosielateľom. Nejako takto:

parameters:
	page:
		name: 'Web'
		email: 'noreply@web.sk'

factories:
	mailer:
		class: Nette\Mail\Message
		setup:
			- setFrom(%page.email%, %page.name%)

	LDAPMailer < mailer:
		setup:
			- addTo('john@doe.com')

Ako si mám teraz vyžiadať túto továrničku (napr. LDAPMailer) v presenteri? Ja na to za svet neviem príjsť.

Ďakujem za Vašu pomoc

Editoval mbskot (4. 11. 2013 21:58)

Šaman
Člen | 2640
+
0
-

Nevím, jakou máš verzi Nette. V nové 2.1 jsou v sekci factories generované služby, které umí danou instanci vytvořit. Ve staré se to chová podobně jako obyčejné služby, což ti tady bude nejspíš stačit.

Pokud chceš něčeho vytvářet větší množství, tak si nech předat instanci továrničky a pak pomocí ní vytvářej konkrétní instance az v presenteru.

V každém případě to do presenteru dostaneš pomocí inject metod.

mbskot
Člen | 42
+
0
-

Skúšam to na najnovšom Nette 2.1 nejako takto:

<?php
namespace FrontModule;

use Nette\Mail\Message;

final class MyAccountPresenter extends BasePresenter
{
	/** @var Message */
	private $ldapMailer;


	/**
	 * @param Message $mailer
	 */
	public function injectLDAPMailer(Message $mailer)
	{
		$this->ldapMailer = $mailer;
	}

	// ...
}

no vyhadzuje mi to Nette\DI\ServiceCreationException

No service of type Nette\Mail\Message found. Make sure the type hint in FrontModule\MyAccountPresenter::injectLDAPMailer() is written correctly and service of this type is registered.

Takže v čom je chyba, že to nefunguje a ako by som dostal inštanciu továrničky do presentera?
Pozrel som si v tempe vygenerované služby a našiel som tam len toto:

/**
 * @return Nette\Mail\Message
 */
public function createService__LDAPMailer()
{
	$service = new Nette\Mail\Message;
	$service->setFrom('noreply@web.sk', 'Web');
	$service->addTo('john@doe.com');
	return $service;
}
Šaman
Člen | 2640
+
0
-

V Nette 2.1 jsou services, které se vytvoří v DI kontejneru jako instance a můžeš je injectovat. Sekce factories slouží k vytvoření generované továrničky.

Takže u tebe – pokud chceš ten mailer jako službu, tak nepoužívej sekci factories a hoď to do services. Pak to půjde injectovat.
Anebo si nastuduj generované továrničky (odkaz od @pave.kucera) a pak si můžeš vytvářet v presenteru více unikátních instancí.

⇒ Pokud nevíš, co jsou generované továrničky, tak používej jenom sekci services. Můžeš si případně vytvořit nějakou servisu FooFactory, kterou si injectuješ jako službu a pomocí které budeš vytvářet více instancí třídy Foo. (Což přesně dělají ty generované továrny, jen se kód té služby FooFactory generuje a nemusíš psát rutinně stejné třídy s jedinou metodou create()).