Mail/Message default setFrom z configu

monty
Člen | 66
+
0
-

Ahoj.

Marně se snažím vyřešit jednu věc a už mi ze všech těch předávání závislostí a vazeb asi praskne hlava, takže se obracím na Vás, zkušenější :)

Rád bych si při vytváření zpráv pro Mailer natahoval výchozího odesílatele z configu, abych při přechodu na produkční server změnil jen jeden parametr.

Vytvořil jsem si službu, a do ní, za pomoci DI, konstruktorem předal parametr definovaný v local configu, ale pak mi došlo, že když budu chtít v presenteru vytvořit víc mailů, už nevím, jakým způsobem paremtr předat.

Budu vděčný za každou radu.

Díky
Peťa

Editoval monty (5. 12. 2017 21:51)

Pavel Kravčík
Člen | 1180
+
0
-

Pokud máš parametr ve službě, tak by to mělo být v pohodě. Jakože bys měnil výchozí odesílatele v závislosti na datech či mailu?

monty
Člen | 66
+
0
-

Pavel Kravčík napsal(a):

Pokud máš parametr ve službě, tak by to mělo být v pohodě. Jakože bys měnil výchozí odesílatele v závislosti na datech či mailu?

Jde mi o to, aby mi při vytváření mailu a nezadání setFrom, Nette použilo výchozího odesílatele, kterého bych si rád nastavil právě přes ten config. A ano, v případě potřeby bych si ho klidně změnil v rámci objektu.

Upřesním ještě v čem tkví můj problém.
Všechno mi funguje tak, jak má, jenže jen v případě, že se objekt vytvoří přes DI..

/** config **/
services:
	mail:
		class: App\Services\Mail(%defaults%)
		parameters:
			defaults:
				from: "odesilatel@domena.cz"


/** služba**/
namespace App\Services;

use Nette\Mail\Message;

class Mail extends Message {

	use \Nette\SmartObject;

	public function __construct(array $defaults) {
		parent::__construct();
		$this->setFrom($defaults["from"]);
	}
}

/** presenter **/
use App\Services\Mail;
use Nette\Mail\IMailer;

class Presenter {

	protected $Mail, $Mailer;

	public function __construct(Mail $Mail, IMailer $Mailer) {
		$this->Mail = $Mail;
		$this->Mailer = $Mailer;
	}

	public function foo() {
		/** předpokládám, že takhle by to mělo fungovat bez chyby **/
		...
		$this->Mail->setSubject("Test mail");
		$this->Mail->setBody("Obsah test mail");
		$this->Mailer->send($this->Mail);
	}

	public function foo2() {
		/** takhle už ale ne, zahlásí chybu, že konstruktoru chybí parametr(pole),
		což je logický, ale nevím, jak jinak z configu parametr získat **/

		$mail= new Mail();
		$mail->setSubject("Test mail");
		$mail->setBody("Obsah test mail");
		$this->Mailer->send($mail);
	}
}

Zatím to řeším tak, že mám odesílatele nastaveného jako konstantu v presenteru, což ale zrovna moc globální není a zároveň asi trochu prasárna, což? :>

„Zglobalizovat“ by se to dalo ještě vytvořením nějaké „config“ třídy, kde budu sdružovat všechny společné konstanty, ale to mi přijde asi zbytečný a navíc taky značně nehezký, nebo se pletu? Když tu máme tak hezky fungující config…jen se do něj neumím dostat vždycky, když potřebuju :)

Prosím o radu z tohodle bludiště :)

Díky
P

Editoval monty (6. 12. 2017 14:45)

Pavel Kravčík
Člen | 1180
+
+2
-

No a proč nepřetížíš tu metodu send v tvém Maileru? A do konstruktoru si dej nepovinný parametr, když bude chybět může ho nastavit až ten Mailer.

public function send($message)
{

$message->setFrom('tomio@spd.cz');

parent::send($message);
}

Editoval Pavel Kravčík (6. 12. 2017 15:14)

monty
Člen | 66
+
0
-

Pavel Kravčík napsal(a):

No a proč nepřetížíš tu metodu send v tvém Maileru? A do konstruktoru si dej nepovinný parametr, když bude chybět může ho nastavit až ten Mailer.

public function send($message)
{

$message->setFrom('tomio@spd.cz');

parent::send($message);
}

No vidíš, to mě nenapadlo, nastavit si odesílatele až v Maileru.
To půjde!

Moc díky Pavle ;)

Pavel Janda
Člen | 977
+
0
-

@monty A nechceš to zkusit nějak elegantněji zabalit? :) Zkus mrknout na ublaboo/mailing. Tady je vidět konfigurace defaultního odesílate: https://ublaboo.org/…onfiguration

monty
Člen | 66
+
0
-

Pavel Janda napsal(a):

@monty A nechceš to zkusit nějak elegantněji zabalit? :) Zkus mrknout na ublaboo/mailing. Tady je vidět konfigurace defaultního odesílate: https://ublaboo.org/…onfiguration

Ahoj.

No vidíš, takhle elegantně jsem to chtěl vyřešit.
A už vyřešil :)

I když samozřejmě ne v tako sofistikovaným rozšíření :)

Děkuju za tip, možná ho využiju v další fázi.

Mějte se Pavlové ;)