Vyskočí chyba v laděnce InvalidArgumentException místo vypsání textu chyby do zpráv

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

Dobrý den,

občas jsem něco programoval v PHP neobjektově a rozhodl jsem se, že to zkusím s objekty a rovnou jsem se pustil i do použití frameworku Nette. Spoustu věcí se tím pádem učím.

Na začátku všeho jsem se zasekl u výběru správné verze nette. Vybral jsem nakonec nette 2 alpha prefixovanou verzi, ale postupem času, kdy musím ke kódům doplňovat prefix začínám nabývat dojmu, že jsem se rozhodl špatně. Podařilo se mi „poslepovat“ několik kódů, které řeší přihlašování uživatelů, jejich registraci a posílání emailů. Každopádně teď jsem se zasekl na tom, že jsem si stáhl doplněk smtpMailer a při testování jsem narazil na věc, se kterou jsem se setkal už před tím (vyjímka pro vypsání chyby potřebovala doplnit při odmítnutí N před AuthenticationException, což je ale funkce nette), ale teď nemůžu problém odhalit. Doplněk jsem nainstaloval, nastavil a všechno bylo OK, testovací mail se odeslal a i dorazil :). Pak jsem ale zkusil úmyslně špatně doplněk nastavit a u adresy from jsem mu nastavil mail bez zavináče. No a v ten moment vyskočila ona vyjímka z předmětu, která je podle mě přímo z PHP. Nevypíše se mi normálně text chyby do flash zpráv. Nevím jestli to je takto správně, právě si myslím, že by to mělo vypsat chybu „uživatelsky“. Kód, na kterém to končí je tento:

...
if (!preg_match('#^[^@",\s]+@[^@",\s]+\.[a-z]{2,10}$#i', $email)) {
	throw new InvalidArgumentException("Email address '$email' is not valid.");
}
...

Chápu to špatně a má to takto fungovat?

Díky

redhead
Člen | 1313
+
0
-

No ono chybu musíš odchytit a vložit do flashmessages přes metodu presenteru ( $this->flashmessage("text zpravy") ); Uživatel by vůbec neměl vidět na jakém řádku a co selhalo.

radoslavius
Člen | 4
+
0
-

Díky za reakci. Tak jsem se tím začal prokousávat dál. Vyjímkami jsem se nikdy moc nezabýval. Ten kousek kódu co je v mém úvodním příspěvku je ze souboru MailMinePart.php z balíku Nette. Konkrétně funkce:

<?php
public function setHeader($name, $value, $append = FALSE)
{
	if (!$name || preg_match('#[^a-z0-9-]#i', $name)) {
		throw new InvalidArgumentException("Header name must be non-empty alphanumeric string, '$name' given.");
	}

	if ($value == NULL) { // intentionally ==
		if (!$append) {
			unset($this->headers[$name]);
		}
	} elseif (is_array($value)) { // email
		$tmp = & $this->headers[$name];
		if (!$append || !is_array($tmp)) {
			$tmp = array();
		}

		foreach ($value as $email => $name) {
			if ($name !== NULL && !NString::checkEncoding($name)) {
				throw new InvalidArgumentException("Name is not valid UTF-8 string.");
			}

			if (!preg_match('#^[^@",\s]+@[^@",\s]+\.[a-z]{2,10}$#i', $email)) {
				throw new InvalidArgumentException("Email address '$email' is not valid.");
			}

			if (preg_match('#[\r\n]#', $name)) {
				throw new InvalidArgumentException("Name must not contain line separator.");
			}
			$tmp[$email] = $name;
		}

	} else {
		$value = (string) $value;
		if (!NString::checkEncoding($value)) {
			throw new InvalidArgumentException("Header is not valid UTF-8 string.");
		}
		$this->headers[$name] = preg_replace('#[\r\n]+#', ' ', $value);
	}
	return $this;
}
?>

Po chvilce hledání a čtení jsem do svého presenteru, kde chci odeslat email vložil něco takového:

<?php
	try {
		$mymail = new SendMail();
		$mymail->send(array('...@gmail.com'), 'Test');
	} catch (InvalidArgumentException $e) {
		$this->flashMessage($e->getMessage());
	}
?>

a zdá se, že to funguje dle mého očekávání. Je to správné řešení? Teď ještě musím nastudovat jak tu flash zprávu vyhodit jako chybovou a ne informativní :)

Aurielle
Člen | 1281
+
0
-

Předávat text výjimky do flash zprávičky je špatné řešení, koncový uživatel by se o těchto chybách neměl dovědět… Co se týče typu flash zprávičky, použij druhý parametr, který si pak vypíšeš a nastyluješ v šabloně (třeba jako n:class="$flash->type").