Ako funguje interface IMailer?

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

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
+
+3
-

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

iNviNho
Člen | 352
+
0
-

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.

CZechBoY
Člen | 3608
+
+1
-

@iNviNho lepší je vždycky vyžadovat interface. Nikdy nevíš kdy uděláš novou implementaci, která bude tahat/ukládat třeba do jinýho úložiště.

Felix
Nette Core | 1247
+
+1
-

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
+
+1
-

@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
+
0
-

@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
+
0
-

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)

iNviNho
Člen | 352
+
0
-

@CZechBoY ďakujem, z toho API už mi je všetko jasné :)

CZechBoY
Člen | 3608
+
+1
-

@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
+
+2
-

@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.

chemix
Nette Core | 1310
+
+1
-

@iNviNho na lokalni testovani emailu je jak stribrna kulka na upiry nextras email panel

iNviNho
Člen | 352
+
0
-

@chemix wau, už to skúšam, bomba! Dakujem :)