Použitie továrničky v presenteri
- mbskot
- Člen | 42
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
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
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
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()
).