Vytvořit jako obal třídy nebo službu nebo jak?
- Leprikon
- Člen | 1
Ahoj,
budu po celém webu používat posílání emailů s tím, že se bude měnit šablona emailu a další věci jako nadpis emailu a tak.
Kód kterým to vše odesilám vypadá takto:
$template = $this->createTemplate();
$template->setFile(__DIR__ . '/../templates/email-sablona.latte');
$template->values = $values;
$mail = new Message;
$mail->setFrom('robot@neco.cz')
->addTo($values["email"])
->setSubject('Nadpis')
->setHtmlBody($template);
$mailer = new SendmailMailer;
$mailer->send($mail);
a říkal jsem si, že by bylo hezké a ne tak ukecané kdybych to hodil do nějaké obalující třídy nebo služby a mohlo by to vypadat takto:
- $x = new MojeOdesilaciTrida;
$x->nastaveniSablony = …
$x->nastaveniXDalsichveci
$x->send();
akorát si říkám, že v takto vytvořené třídě mi nepůjde vytvorit
šablonu přes $template = $this->createTemplate();
a dědit
třídu přes UI\Presenter mi přijde jako blbost.
- nebo jako sluzbou … ale službám moc nerozumím, resp tady v tom nevidím žádnou přidanou hodnotu.
Mohl by mě někdo nějak navést?
- Zax
- Člen | 370
Služba skutečně přidanou hodnotu mít nebude, jelikož služba = instance a ty asi potřebuješ pokaždé novou instanci, ale možná by nebylo úplně špatné řešení si udělat továrnu, která ti ty objekty bude vytvářet, a tu zaregistrovat jako službu – pak není problém do třídy dostat závislosti jako TemplateFactory. Odesílací třídu si můžeš napsat jak potřebuješ.
Příklad továrny:
class MojeOdesilaciTridaFactory extends Nette\Object {
protected $defaultFrom;
protected $templateFactory;
public function __construct($defaultFrom, Nette\Application\UI\ITemplateFactory $templateFactory) {
$this->defaultFrom = $defaultFrom;
$this->templateFactory = $templateFactory;
}
public function create(Nette\Application\UI\Control $control) {
// Metoda createTemplate v TemplateFactory vyžaduje UI\Control, proto si jej musíme také předat
$sender = new MojeOdesilaciTrida($this->defaultFrom, $this->templateFactory, $control);
// ...
return $sender;
}
}
Config:
parameters:
mailFrom: "robot@neco.cz"
services:
- MojeOdesilaciTridaFactory(%mailFrom%) # templateFactory se předá automaticky
Do komponenty/presenteru si předáš tuto továrnu a místo „new“
použiješ něco
jako $mySender = $this->myFactory->create($this);
Stačí takhle? :-)
Editoval Zax (29. 9. 2014 22:40)