Call to a member function send() on a non-object

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

Zdravím,
potřeboval bych poradit kde dělám chybu při práci s odesíláním emailu.

Pokud si v presenteru například do action dám

<?php
    private $mailer;

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

    public function actionEmail() {

        $template = new Nette\Templating\FileTemplate('app/templates/emails/empty.latte');
        $template->registerFilter(new Nette\Latte\Engine);
        $template->registerHelperLoader('Nette\Templating\Helpers::loader');


        $mail = new Message;
        $mail->setFrom('example@example.com', 'example.com');
        $mail->addTo("example@example.com");
        $mail->setSubject('Test emailu');
        $mail->setHtmlBody($template);
        $this->mailer->send($mail);

        $this->flashMessage('Check email');

    }
?>

všechno funguje, pokud si ale chci na odesílání vytvořit componentu, nebo udělat službu začně to hlásit chybu:
Call to a member function send() on a non-object

Když jsem si do var_dump dal $mail zjistil jsem že nedostává informace z šablony a proto není zřejmě objekt aby bylo co odesláno. Přitom podobně jsem to viděl řešené v jiné aplikaci a tam to fungovalo, takže je pravděpodobné že něco důležitého opomíjím.

A componenta či služba by měla být správně, jelikož pokud použiji čísté php mail() bez šablony tak se zprávy odesílají.

Za případné popostrčení kam dál budu velice vděčen.

Jiří Nápravník
Člen | 710
+
0
-

Problém pravděpodobně bude v tom, že se ti nenjectne ve službě/komponentě IMailer, pokud to děláš takto:

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

to funguje automaticky jenom v presenteru. Jinde je doporučenou metodou injectovat tyhle věci v konstruktoru. Případně jestli chceš mít tyhle inject* metody i u služeb apod. tak musíš v neonu nastavit autowired: true tuším

David Matějka
Moderator | 6445
+
0
-

zavislosti sluzeb/komponent je nejlepsi dostavat pres konstruktor. Pokud chces pouzit inject metody, musis u definice sluzby v neonu toto zapnout pomoci inject: true
viz http://nette.matej21.cz/di.pdf

Editoval matej21 (10. 3. 2014 23:26)

oskarmaniak
Člen | 29
+
0
-

Díky moc za rady,
nakonec opravdu stačilo to dát do konstruktoru viz krásně zpracovaný PDF od matej21.

Ještě jednou děkuji za nové zkušenosti.