Odesílání emailů – 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.
kikinet
Člen | 35
+
0
-

Zdravím,

snažím se rozjet odesílání emailů po úspěšné registraci.

Mám RegistrationFormControl.php

interface RegistrationFormControlFactory{
  /** @return RegistrationFormControl */
  public function create();
}

class RegistrationFormControl extends FormComponent
{
  protected function createComponentRegistrationForm()
  {
    // FORM
  }

  public function formSucceeded($form, $values)
  {
    try {
      $mail = new \Nette\Mail\Message;
      $mail->setFrom('abc@aaa.cz', 'ABC')
           ->addTo($values->email)
           ->setSubject('Registrace')
           ->setBody($message);

      $this->mailer->send($mail);
    } catch (\Exception $e) {
      $form->addError($e->getMessage());
    }
  }
}

A FormComponent:

class FormComponent extends \Nette\Application\UI\Control
{

	public $mailer;

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

}

Ale vždy to skončí chybou Call to a member function send() on a non-object na řádku $this->mailer->send($mail);
Kde může být chyba?

ali
Člen | 342
+
0
-

dumpni si promennou $this->mailer a mrkni co v ni mas

Oli
Člen | 1215
+
0
-

Chyba je v tom, že jestli sis to nenastavovala jinak, tak v komponentě nefunguje nic jiného než constructor injection, takže se ti IMailer nepředá…

Editoval Oli (13. 8. 2015 23:16)

kikinet
Člen | 35
+
0
-

ali napsal(a):

dumpni si promennou $this->mailer a mrkni co v ni mas

V tom mám tu chybovou hlášku.

Oli napsal(a):

Chyba je v tom, že jestli sis to nenastavoval jinak, tak v komponentě nefunguje nic jiného než composer injection, takže se ti IMailer nepředá…

Pravděpodobně nenastavovala. Nicméně netuším moc o čem mluvíš, můžeš mě prosím navést správným směrem?

kikinet
Člen | 35
+
0
-

Oli napsal(a):

@kikinet https://doc.nette.org/…dependencies#…

Pokud ve FormControl nahradím inject* metodu za __constructor hází to pořád stejnou chybovou hlášku.

enumag
Člen | 2118
+
0
-

kikinet napsal(a):

Oli napsal(a):

@kikinet https://doc.nette.org/…dependencies#…

Pokud ve FormControl nahradím inject* metodu za __constructor hází to pořád stejnou chybovou hlášku.

To už musíš mít někde typo nebo podobnou drobnost protože pokud v konstruktoru ten mailer vyžaduješ tak se ti bez něj instance nevytvoří. Ledaže potomek přepisuje konstruktor a nevolá parent.

Editoval enumag (13. 8. 2015 23:16)

Oli
Člen | 1215
+
0
-

nemáš tam náhodou constructor? správně je jen __construct

kikinet
Člen | 35
+
0
-

enumag napsal(a):

kikinet napsal(a):

Oli napsal(a):

@kikinet https://doc.nette.org/…dependencies#…

Pokud ve FormControl nahradím inject* metodu za __constructor hází to pořád stejnou chybovou hlášku.

To už musíš mít někde typo nebo podobnou drobnost protože pokud v konstruktoru ten mailer vyžaduješ tak se ti bez něj instance nevytvoří. Ledaže potomek přepisuje konstruktor a nevolá parent.

Je to copy – paste. Pokud tam je překlep, nemůžu ho najít…

class FormComponent extends \Nette\Application\UI\Control
{

	public $mailer;

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

}

a

$this->mailer->send($mail);

EDIT: private $mailer hlásí Cannot read an undeclared property App\Forms\RegistrationFormControl::$mailer.

Oli napsal(a):

nemáš tam náhodou constructor? správně je jen __construct

Málem jsem se lekla, že ano :D ale naštěstí ne

Editoval kikinet (14. 8. 2015 0:02)

Oli
Člen | 1215
+
0
-

@kikinet No právě, pokud to je copy paste, tak tam se nevolá ten parent, jak psal @enumag. Když využíváš konstruktor předka, musíš v potomku zavolat parent::__construct();. To nevoláš, že? Proto se ti nikde nenaplní ta proměnná mailer…

A jestli jo, tak už mě nic nenapadá.

F.Vesely
Člen | 368
+
0
-

Urcite tam mas toto?

class RegistrationFormControl extends FormComponent
{
	public function __consctruct(IMailer $mailer,...)
	{
		parent::__consctruct($mailer);
		...
	}
}

class FormComponent extends Control
{
	protected $mailer;

	public function __construct(IMailer $mailer)
    {
        $this->mailer = $mailer;
    }

}
kikinet
Člen | 35
+
0
-

@F.Vesely, @Oli : Ano bylo to tím. Moje chyba.

Nicméně to pořád nefunguje tak, jak by mělo. Exucution time je neuvěřitelných 60 000ms – 100 000ms. A email se stejně neodešle. Žádná chyba a dump($this->mailer->send($mail)) hlásí NULL

EDIT: Odpověď na to odesílání může být asi tady
Bude to řešení i času?

Editoval kikinet (14. 8. 2015 0:35)

kikinet
Člen | 35
+
0
-

F.Vesely napsal(a):

A pouzivas Nette\Mail\SendmailMailer, nebo Nette\Mail\SmtpMailer?

Používám Nette\Mail\IMailer neboli Nette\Mail\SendmailMailer, ale:

V presenterech a službách nevytvářime mailer ručně, ale pomocí DI si necháme předat Nette\Mail\IMailer.

Editoval kikinet (18. 8. 2015 12:39)