Odesílání emailů – Call to a member function send() on a non-object
- kikinet
- Člen | 35
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?
- kikinet
- Člen | 35
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
Oli napsal(a):
Pokud ve FormControl nahradím inject* metodu za __constructor hází to pořád stejnou chybovou hlášku.
- enumag
- Člen | 2118
kikinet napsal(a):
Oli napsal(a):
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)
- kikinet
- Člen | 35
enumag napsal(a):
kikinet napsal(a):
Oli napsal(a):
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)
- F.Vesely
- Člen | 368
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
@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
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)