Předání flashMessage do presenteru z modelu

Skywalker1
Člen | 1
+
0
-

Zdravím,

rád bych Vás tímto požádal o pomoci – jsem v Nette a i v OOP začátečník – hledal jsme zde na fóru, vyzkoušel X různých rad, ale evidentně mi bude chybět nějaký základ, abych pochopil onu logiku.

Vytvořil jsem vlastní model, ve kterém volám mmj. o metodu „login“, který ověřuje v rámci VmailManageru (vmailmgr) omail (MTA) zpracování požadavků ohledně e-mailových schránek aliasů apod.

Napojení na socket mi funguje, vše OK, ale nyní potřebuji ošetřit jednotlivé výsledky – tedy uvnitř modelu mám toto:

    public function login(string $uzivatel, string $heslo)
    {
        //  kontrola zadanych hodnot
        //      uzivatel
        if(!Validators::isEmail($uzivatel)) {
            if(!Validators::isUnicode($uzivatel)) {
                //  nekdo se pokousi o nejakou prasecinu
                throw new InvalidArgumentException;
            }
        }

        //      heslo
        if(!Validators::isUnicode($heslo)) {
            //  nekdo se pokousi o nejakou prasecinu
            throw new InvalidArgumentException;
        }

        //mame overeno zadani - pokracujeme dale k overeni uctu

        //  slozeni prikazu pro vmail manager
        $this->argumenty=array("listdomain", $uzivatel, $heslo);

        //  zavolame zpracovani prikazu
        $vystup=$this->zpracujPrikaz($this->argumenty);

        //  jednotlive akce, podle výstupu z vmailmgr
        if(str_contains($vystup, 'Invalid or unknown domain name:')) {
            $this->presenter->flashMessage('Uživatel ' .$uzivatel. ' neexistuje v systému - opakujte prosím zadání znovu.');
            $this->redirect('Prihlaseni:Login');
        }

Zpracování probíhá aktuálně v presenteru „PrihlaseniPresenter.php“

    public function renderOver(): void
    {
        //zapis post promennych
        $httpRequest = $this->getHttpRequest();

        //overeni v ramci qmailu (VmailMgr)
        if($this->konstanty['typ_administrace']=="qmail"):
            $omail = new VmailManager($this->konstanty);
            $omail->login($httpRequest->getPost('uzivatel'), $httpRequest->getPost('heslo'));

        //overeni v ramci Postfixu (MySQL databaze)
        elseif($this->konstanty['typ_administrace']=='postfix'):

        //neni zadano => chyba!
        else:
            $this->flashMessage('Zkontrolujte konfiguraci local (direktiva typ_administrace) neodpovida!');
        endif;
    }

Bohužel se mi nedaří propašovat z modelu onu „flashMessage“ – tj řádek:

$this->presenter->flashMessage('Uživatel ' .$uzivatel. ' neexistuje v systému - opakujte prosím zadání znovu.');

Klasické $this->flashMessage končilo s hláškou:
Call to undefined method App\Vmail\VmailManager::flashMessage().
(to bych ještě pochopil)

Ale nemohu přijít na to, jak tedy předat v rámci Modelu onu flashMessage do Presenteru (PrihlaseniPresenter.php), všude na internetu jsem narážel právě na ono:
$this->presenter->flashMessage()

ale už se mi nepodařilo dohledat, proč i přesto dostávám:
Cannot read an undeclared property App\Vmail\VmailManager::$presenter

Určitě to bude nějaká kravina :/ ale po hodině hledání už nevím, je mi jasné, že bude něco systémového (na mé straně špatně) – budu vděčný případně i za vysvětlení, či odkázání – patrně je nutné v modelu definovat použití „nadřazeného“ presenteru, ale nedaří se mi :/

Díky

Filip

ViPEr*CZ*
Člen | 820
+
+2
-

Model nemá vědět o presenteru. Pokud je to nějaká věc typu ‚Invalid or unknown domain name:‘ použij klasicky nějakou výjimku a tu si pak na příslušném místě odchyť (try…catch).

Kamil Valenta
Člen | 822
+
+3
-

On by model neměl sahat ven na presenter a jeho metody. Modelu by mělo být jedno, zda jej využívá presenter, API, nebo zcela jiná služba.
Model by tedy měl poskytnout nějakou návratovou hodnotu (nebo vykopnout Exceptionu) a každý si na to zareaguje podle svého – presenter např. vygeneruje flashmsg.

dakur
Člen | 493
+
+3
-

Tedy:

public function login(string $uzivatel, string $heslo)
{
    // ...

    //  jednotlive akce, podle výstupu z vmailmgr
    if(str_contains($vystup, 'Invalid or unknown domain name:')) {
        throw new \Exception('Invalid or unknown domain name');
//      throw new InvalidOrUnknownDomainName(); // nebo možno mít i přímo výjimku takto pojmenovanou
    }
}

a potom v presenteru:

public function renderOver(): void
{
        //zapis post promennych
        $httpRequest = $this->getHttpRequest();

        //overeni v ramci qmailu (VmailMgr)
        if($this->konstanty['typ_administrace']=="qmail"):
            $omail = new VmailManager($this->konstanty);
            try {
                $omail->login($httpRequest->getPost('uzivatel'), $httpRequest->getPost('heslo'));
            } catch (\Exception $e) {
                 $this->flashMessage('Uživatel ' .$uzivatel. ' neexistuje v systému - opakujte prosím zadání znovu.');
                 $this->redirect('Prihlaseni:Login');
            }

        //overeni v ramci Postfixu (MySQL databaze)
        elseif($this->konstanty['typ_administrace']=='postfix'):

        //neni zadano => chyba!
        else:
            $this->flashMessage('Zkontrolujte konfiguraci local (direktiva typ_administrace) neodpovida!');
        endif;
    }

Program v PHP funguje typicky tak, že voláte funkci/metodu a pokud je vše OK, tak něco (nebo nic) vrátí a pokud je nějaký chybový stav, tak vyhazuje výjimku, kterou pak můžete a nemusíte chytnout.

Je pravda, že PHP u půlky nativních funkcí vrací v případě chyby false. To je ale spíš relikt, od kterého se upouští.