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