Chyba ve výpisu vyjímky

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

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

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)

Honza Marek
Člen | 1664
+
0
-

Přesně tak…

Jirda
Člen | 103
+
0
-

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

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

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

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 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í)

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.

Foowie
Člen | 269
+
0
-

Nepoužíváš include nebo require vícekrát na soubor se třídou Users? (Kdyžtak je přepiš na include_once / require_once), nebo vynechej úplně pokud ten máš ten soubor v models.

Jirda
Člen | 103
+
0
-

Foowie napsal(a):

Nepoužíváš include nebo require vícekrát na soubor se třídou Users? (Kdyžtak je přepiš na include_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í.

Foowie
Člen | 269
+
0
-

Hmmm … bohužel bez zdrojáků asi nic dalšího nevymyslím. Možná napadne kde je chyba někoho jiného …

Patrik Votoček
Člen | 2221
+
0
-

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

vrtak-cz napsal(a):

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?

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