Ako funguje interface IMailer?
- iNviNho
- Člen | 352
Ahojte,
Chcel by som sa opýtať na interface Nette\Mail\IMailer a ako tento interface funguje.
Ako to, že po injectnutí IMaileru sa mi vytvorí SmtpMailer? Vie mi niekto povedať ako kde čo?:D
<?php
/**
* Mailer interface.
*/
interface IMailer
{
/**
* Sends email.
* @return void
* @throws SendException
*/
function send(Message $mail);
}
?>
Ked si skúsim injectnúť svoj vlastny interface IMultimediaSaver tak dostávam nejaký Container…iMultimediaSaver. Až ked použijem metodu create až potom dostávam triedu MultimediaSaver
<?php
/**
* @author Vladino
*/
interface IMultimediaSaver {
/**
* @return MultimediaSaver
*/
public function create(FileUpload $fileUpload);
}
?>
Ďakujem :)
- David Matějka
- Moderator | 6445
kdyz si vyzadas IMailer, tak nette DI injectne implementaci, ktera je registrovana v kontejneru. to je defaultni SendmailMailer. Pokud zapnes smtp v configu, tak DI preda SmtpMailer
to druhe, o cem mluvis, jsou generovane tovarny. nette pro
IMultimediaSaver
vygeneruje implementaci. mimochodem, ten iface by
se mel jmenovat IMultimediaSaverFactory
, jelikoz to neni rozhrani
toho MultimediaSaver-u, ale te tovarny na ten MultimediaSaver
- Felix
- Nette Core | 1247
iNviNho napsal(a):
Aha, čiže ak by v Nette existoval iba SmtpMailer, tak by existencia IMaileru bola zbytočná? Vtedy by stačilo injectnúť SmtpMailer? Je to iba kvôli tomu?
Áno, máš pravdu, to som si neuvedomil, budem si na to dávať pozor.
Pokud by existovaly obe implementace, tzn. jak SendmailMailer
,
tak SmtpMailer
, tak nette/di autowiring bude vyhazovat vyjimku, ze
mas definovano vice implementaci a tudiz nevi, kterou tam ma dosadit. Na to
bacha! :-)
Editoval Felix (9. 8. 2016 11:28)
- CZechBoY
- Člen | 3608
@Felix Tak ono existuje více implementací (FallbackMailer, SmtpMailer, SendmailMailer), ale jak psal @DavidMatějka tak se zvolí SMTP pouze pokud existuje konfigurace pro smtp server. https://api.nette.org/…ion.php.html#…
- chemix
- Nette Core | 1310
@iNviNho ja k tomu dodam jen ze pokud budes chtit testovat, tak si napises vlastni implemetnaci imaileru, ktera to bude ukladat do souboru (nebo lepe, pouzijes jiz hotove reseni treba z nextras) a pro testy si nahradis pouzivani maileru na tento souborovy a bude se ti to mnohem lepe testovat.
a ten autowire se da samosebou pro urcite servisy vypnout.
services:
- PDO('mysql:', root, toor)
db2:
create: PDO('sqlite:soubor')
autowired: no
- iNviNho
- Člen | 352
Super chlapi,
ďakujem, pochopil som :)
Napísal som si vlastný MyMailer, ale vyskúšam to spraviť aj cez interface, znie to zaujímavo.
<?php
class MyMailer extends Object {
/** @var SettingsService */
public $settingsService;
/** @var SmtpMailer */
private $smtpMailer;
public function __construct(SettingsService $settingsService) {
$this->settingsService = $settingsService;
$options = [];
$options["host"] = $this->settingsService->findOneByOption("mailer_host")->getDescription();
$options["port"] = $this->settingsService->findOneByOption("mailer_port")->getDescription();
$options["username"] = $this->settingsService->findOneByOption("mailer_username")->getDescription();
$options["password"] = $this->settingsService->findOneByOption("mailer_password")->getDescription();
$options["secure"] = $this->settingsService->findOneByOption("mailer_secure")->getDescription();
$options["timeout"] = $this->settingsService->findOneByOption("mailer_timeout")->getDescription();
$this->smtpMailer = new SmtpMailer($options);
}
public function send(Message $mail) {
try {
$this->getSmtpMailer()->send($mail);
return true;
} catch (SmtpException $ex) {
return false;
}
}
private function getSmtpMailer() {
return $this->smtpMailer;
}
}
?>
Použitie je také isté ako IMaileru, injectnem teda MyMailer a na ňom iba jedna metóda send().
@chemix áno, aj to ma napadlo, ale ked testujem, tak si odosielam maily klasicky na svoj mail a tam checknem či to funguje a ako to vyzerá, aké sú výhody to neposielať, ale si to napríklad vložiť do súboru? Napadá ma jedine, že pri väčšom množstve mailov, môže napr. google smtp server zablokovať na 24 hodín odosielanie.
Editoval iNviNho (9. 8. 2016 11:02)
- CZechBoY
- Člen | 3608
@iNviNho Pokud bys využil interface tak můžeš při testování vložit jakoukoliv implementaci toho IMaileru (ten tvůj MyMailer, SmtpMailer, SendmailMailer nebo úplně jinej). Takhle vyžaduješ jen tu tvoji třídu a není to vůbec variabilní. Celkem se mi líbí vysvětlení na wiki (ale o DIC) o florbalovém hráči https://cs.wikipedia.org/…í_závislostí#…
Zapisování emailu do souboru se hodí pro testy – prostě odešleš mail, zkontroluješ jestli v souboru je text jaký očekáváš a vyhodnotíš test; pokud bys chtěl použít smtp/mail tak by ses musel složitě přihlašovat na email…
- chemix
- Nette Core | 1310
@iNviNho ja myslel automaticke testovani. Ze spustis treba
./tester tests
a ono to za tebe samo udela vsechny testy jelikoz
nechces pri kazdem testovani koukat do schranky zdali se poslalo to co melo.
Navic nechces testovat zdali ti funguje smtp server (to beru jakoze musi
fungovat) ale chces testovat zdali se sestavi email takovy jaky ma a „posle“
se na adresy jake ma.