Předání flashMessage do presenteru z modelu
- Skywalker1
- Člen | 1
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
- Kamil Valenta
- Člen | 822
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
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í.