Validace latte ze stringu včetně proměnných
- Blaueminence
- Člen | 31
Ahoj,
potřeboval bych pomocí funkce zvalidovat latte uložené v proměnné včetně jeho proměnných a zachytit případné E_NOTICE Undefined variable. Zkusil jsem si vytvořit vlastní handler
private function latteValidate($text, $params) {
$template = new \Nette\Bridges\ApplicationLatte\Template(new \Latte\Engine());
$latte = $template->getLatte();
$latte->setLoader(new \Latte\Loaders\StringLoader);
restore_error_handler();
restore_exception_handler();
set_error_handler(array($this, 'errHandle'), E_NOTICE | E_STRICT);
try {
$res = (string) $latte->renderToString($text, $params);
} catch (\Nette\Application\BadRequestException $exc) {
//echo $exc->getTraceAsString();
}
}
function errHandle($errNo, $errStr, $errFile, $errLine, $errContext) {
$msg = "$errStr in $errFile on line $errLine";
if ($errNo == E_NOTICE || $errNo == E_WARNING) {
throw new \Nette\Application\BadRequestException($msg, $errNo);
} else {
}
}
ale vyhazuje mi to
Fatal error: Uncaught exception 'Nette\Application\BadRequestException' with message 'A session had already been started - ignoring session_start()
na řádce vyhazující výjimku a na stejném místě taky
ette\Application\BadRequestException: A session had already been started - ignoring session_start()
,
resp. na vendor\tracy\tracy\src\Tracy\Bar.php on line 89
.
Dá se E_NOTICE vůbec nějakým způsobem zachytit? Díky za odpověď.
- Blaueminence
- Člen | 31
Jenže já se nechci toho „undefined variable“ zbavit, ale zachytit to, abych zvalidoval ten string s latte.
- Blaueminence
- Člen | 31
Díky za pomoc. Ty restore funkce tam byly jen proto, že někde psali, že je potřeba je volat před nastavením error handleru :D nakonec jsem to vyřešil takto:
public static function latteValidate($text, $params) {
$template = new \Nette\Bridges\ApplicationLatte\Template(new \Latte\Engine());
$latte = $template->getLatte();
$latte->setLoader(new \Latte\Loaders\StringLoader);
set_error_handler(function($errno, $errstr, $errfile, $errline) {
throw new \Nette\Application\BadRequestException("<b>Custom error:</b> [$errno] $errstr<br> Error on line $errline in $errfile<br>");
});
try {
$res = $latte->renderToString($text, $params);
} catch (\Exception $e) {
return false;
}
return true;
}
- greeny
- Člen | 405
Ještě možná restore_error_handler předtím než vyhodíš vyjímku nebo potom co provedeš kód. Jo a chytej jen vyjímku co vyhazuješ. Viz:
set_error_handler(function($errno, $errstr, $errfile, $errline) {
restore_error_handler();
throw new \Nette\Application\BadRequestException("<b>Custom error:</b> [$errno] $errstr<br> Error on line $errline in $errfile<br>");
});
try {
$res = $latte->renderToString($text, $params);
restore_error_handler();
} catch (\Nette\Application\BadRequestException $e) {
return false;
}
Editoval greeny (18. 3. 2015 13:32)
- David Matějka
- Moderator | 6445
a nevyhazuj Nette\Application\BadRequestException, vytvor si vlastni vyjimku. Z namespace Nette vyhazuj vyjimky minimalne – pouze v pripadech, kdy tak vyzaduje napriklad interface, ktery implementujes (tedy treba, ze IAuthenticator ma vyhodit AuthenticationException)
- Blaueminence
- Člen | 31
OK, máte obra pravdu, díky za tipy. Dělám tohle prvně a už se mi teď stalo, že mi to vyhodilo i jinou výjimku, kterou jsem samozřejmě zachytit nechtěl, takže si napíšu vlastní.