Chyba ve výpisu vyjímky
- Jirda
- Člen | 103
Zdravím,
nemůžu přijít na to, v čem je chyba. Registrace a odchytávání výjimek funguje správně, ale až na jeden případ.
Pokud registrace projde úspěšně, tzn. že uživatel registruje jedinečný login a email, přičemž se data uloží do tabulky v db, tak poté nedojde k přesměrování na Default:, ale je vypsána flash message a zároveň se pro mě nepochopitelně vypíše error ze strany formuláře typu:
Tzn, že musí dojít k vyhození výjimky, na základě toho redirect a to i přesto, kdybych tam třeba dosadil redirect(‚this‘).
(Když zakomentuju redirect, k vyhození výjimky nedojde).
Už si nevím rady, v čem by to mohlo být.
Část kódu z registerFormSubmitted – metoda, která přebírá hodnoty z formu
<?php
try {
$users = new Users();
$id = $users->createUser($data);
$this->flashMessage('Registrace proběhla úspěšně.');
$this->redirect('Default:');
} catch (Exception $e) {
$form->addError($e->getMessage());
}
?>
Metoda registrujícího uživatele:
<?php
function createUser($data)
{
$username = $data['username'];
$check_username = $this->db->dataSource("SELECT id FROM users WHERE username=%s", $username);
if (count($check_username) > 0) {
throw new Exception("Uživatel s uživatelským jménem '$username' je již registrován.");
}
$email = $data['email'];
$check_email = $this->db->dataSource("SELECT id FROM users WHERE email=%s", $email);
if (count($check_email) > 0) {
throw new Exception("Uživatel s tímto kontaktním emailem '$email' je již registrován.");
}
$result = $this->db->query('INSERT INTO users', $data);
if (!$result) {
throw new Exception("Došlo k chybě. Zkuste to prosím později.");
}
return $this->db->insertId();
}
?>
Předem díky za Vaše rady.
Editoval Jirda (2. 7. 2009 22:56)
- Foowie
- Člen | 269
Metoda redirect vyvolává při zavolání výjimku (RedirectingException) a
ty ji úspěšně zachytíš v catch bloku :) Skus vyhazovat a zachytávat
né-přímo Exception, ale vytvoř si nějakého potomka.
( Na to samé se tu už dneska někdo ptal, ale nechtělo se mi to
hledat… )
Editoval Foowie (2. 7. 2009 23:19)
- Jirda
- Člen | 103
Foowie napsal(a):
Metoda redirect vyvolává při zavolání výjimku (RedirectingException) a ty ji úspěšně zachytíš v catch bloku :) Skus vyhazovat a zachytávat né-přímo Exception, ale vytvoř si nějakého potomka.
Aha, v používání výjimek jsem úplný začátečník. Mohl bych dostat
radu, jak třeba vytvořit vlastní RegisterException? Koukal jsem do manuálu,
ale i přesto se mi nedaří to rozjet. Kam bych měl třídu s vyjímkou
umístit? Do modelu?
A nebo si mám vytvořit nějaký soubor myExceptions a do něj všechny tyto
třídy, které budou dědit Exception vložit?
Doporučte prosím ten nejlepší a především nejefektivnější postup.
Díky.
- Ondřej Mirtes
- Člen | 1536
Já používám na formuláře třeba IOException
, která je
obsažena přímo v Nette. Vlastní exception vytvoříš jako třídu, která
dědí od Exception
. Do jakého souboru si ji umístíš je na
tobě, já mám na všelijaké třídy podsložku app/classes/
.
- Foowie
- Člen | 269
Tak pokud ti stačí výjimka s „obyčejnýma vlastnostma“ tak stačí
<?php
class RegisterException extends Exception
{
}
?>
Všechny vlastnosti tvojí nové výjimky budou zděděny po základní
Exception
a soubor patří do modelu. V bloku catch pak zachycuj
RegisterException
. To zajistí, že tento blok odchytí
RegisterException
a všechny jeho potomky. (Pokud bys chtěl chyby
pak jemněji rozlišit nejenom textem, stačí vytvořit další výjimky které
dědí z RegisterException
a
catch(RegisterException $e)
blok ti je zachytí)
Editoval Foowie (3. 7. 2009 8:13)
- Jirda
- Člen | 103
Foowie napsal(a):
Tak pokud ti stačí výjimka s „obyčejnýma vlastnostma“ tak stačí
<?php class RegisterException extends Exception { } ?>
Všechny vlastnosti tvojí nové výjimky budou zděděny po základní
Exception
a soubor patří do modelu. V bloku catch pak zachycujRegisterException
. To zajistí, že tento blok odchytíRegisterException
a všechny jeho potomky. (Pokud bys chtěl chyby pak jemněji rozlišit nejenom textem, stačí vytvořit další výjimky které dědí zRegisterException
acatch(RegisterException $e)
blok ti je zachytí)
Tak jsem to zkusil, vytvořil jsem si v modelu soubor myExceptions.php a do něj vložil zmíněný kód, ale i přesto, teď když dojde k vyhození výjimky, nette vyhodí hlášku:
Cannot redeclare class Users
Třída Users je ta, ve které dojde k vyhození výjimky. Obsahuje tu metodu createUser() a jediná úprava v ní je ta, že místo new Exception teď vytvářím RegisterException.
- Jirda
- Člen | 103
Foowie napsal(a):
Nepoužíváš
include
neborequire
vícekrát na soubor se třídou Users? (Kdyžtak je přepiš nainclude_once
/require_once
), nebo vynechej úplně pokud ten máš ten soubor v models.
Právě že vůbec nikde tyhle funkce nepoužívám ve spojitosti s tímhle souborem a pokud přiložím tu třídu RegisterException přímo do souboru Users.php, tak pak vyjímka funguje, ale to je takové polovičaté řešení.
- Patrik Votoček
- Člen | 2221
Jen mě tak napadlo nevytvářel jsi tu třídu
RegisterException
ze souboru kde máš Users
a
nezapoměl jsi tam class Users
? Zkus sem postnou mini verzi
aplikace (zip) kde je ta chyba reprodukována + revizi nette a verzi PHP.
(Stačí doopravdy jemo minimum kde se ta chyba projeví)
PS OT: ře by nové OG běželo na Nette?
- Jirda
- Člen | 103
vrtak-cz napsal(a):
Jen mě tak napadlo nevytvářel jsi tu třídu
RegisterException
ze souboru kde mášUsers
a nezapoměl jsi tamclass Users
? Zkus sem postnou mini verzi aplikace (zip) kde je ta chyba reprodukována + revizi nette a verzi PHP. (Stačí doopravdy jemo minimum kde se ta chyba projeví)PS OT: ře by nové OG běželo na Nette?
Čekal jsem, že se ozveš:o)))
Mno myslím, že už to nebude nutné, i když nevím, čím to pořád bylo. Přišel jsem totiž na zajímavý úkaz – celý ten projekt je ve složce, kterou když jsem celou tu zkopíroval, abych ji osekal o zbytečnosti a zanechal jen jádro věci, přišel jsem na to, že funguje tak, jak má. Ale ta originální stále hlásila chybu, když jsem ji přejmenoval tak pak jela zas jak má.
Soudím, zda na to nemohla mít vliv třeba cache, ale to už jde mimo mně. Hlavně, že to funguje.
Díky všem za snahu.
Mimo jiné, Vrtáku – nech se překvapit s OG, na čem pojede – nette to nebude:o) To bych rád použil jinde.