Vytvořit jako obal třídy nebo službu nebo jak?

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

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:

  1. $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.

  1. 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
+
+1
-

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)