No service of type Nette\Mail\Message found

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

Zdravím,

v konfigurácií mám použité - setMail(@nette.mail).
Vzhľadom na to, že je metóda setMail definovaná nasledovne:

public function setMail(\Nette\Mail\Message $mail)
{
	$this->mail = $mail;
}

predpokladal by som, že stačí v konfigurácií napísať - setMail.
V takomto prípade ale dostanem Nette\DI\ServiceCreationException
Service ‚registerForm‘: No service of type Nette\Mail\Message found. Make sure the type hint in RegisterForm::setMail() is written correctly and service of this type is registered.

To je bug, malo by to fungovať, nie?
Mám aktuálne Nette z GIT-u staré cca 2 hodiny.

enumag
Člen | 2118
+
0
-

Ne to zcela určitě není bug. Dokonce ti to i jasně říká v čem je problém – neexistuje služba typu Nette\Mail\Message. Takovou Nette opravdu nemá a ani nikdy nemělo.

Čeho se snažíš docílit?

Filip Procházka
Moderator | 4668
+
0
-

Není to bug. Lépe takto

public function setMailer(\Nette\Mail\IMailer $mailer)
{
    $this->mailer = $mailer;
}

Následně pak

$message = new Nette\Mail\Message;
//...
$this->mailer->send($message);
Ondřej Mirtes
Člen | 1536
+
0
-

V aplikacích existují dva typy objektů – servisy a value objekty. Se servisami se dá pracovat v DI kontejneru (může je vytvářet a injektovat do dalších servis), value objekty vytváříš obvykle dynamicky v aplikaci.

Kvíz:

  • Mailer je:
  • Message je:
romiix.org
Člen | 343
+
0
-

enumag napsal(a):

Ne to zcela určitě není bug. Dokonce ti to i jasně říká v čem je problém – neexistuje služba typu Nette\Mail\Message. Takovou Nette opravdu nemá a ani nikdy nemělo.

Čeho se snažíš docílit?

Predpokladal som, že by to malo fungovať, pretože v súbore/www/temp/cache/_Nette.Configurator/_-1fc326ceb08990b99a2ba83ac08c3af8.php mám vygenerované:

/**
 * @return Nette\Mail\Message
 */
public function createNette__mail()
{
	$service = new Nette\Mail\Message;
	$this->callInjects($service);
	$service->setMailer($this->getService('nette.mailer'));
	return $service;
}

Mojim cieľom bolo dodanie $container->nette->createMail() komponente automaticky.

Presenter, createComponent…

$form->mail = $this->context->nette->createMail();

a v komponente…

$mail = $this->mail;
$mail->setFrom($address_from)
		->addTo($address)
		->setSubject($subject)
		->setHTMLBody($template)
		->send();
romiix.org
Člen | 343
+
0
-

dump $this->mail v komponente je Nette\Mail\Message

Filip Procházka
Moderator | 4668
+
0
-

Samozřejmě. Jenže ty potřebuješ tohle, nemůžeš totiž jen tak někam předat metodu (tedy můžeš, ale to je Nette magie z Nette\Object).