Validace latte ze stringu včetně proměnných

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

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ěď.

greeny
Člen | 405
+
0
-

Použij makro {default $var = 1} nebo {ifset $var}Something{/ifset} aby ses zbavil undefined variable.

Editoval greeny (17. 3. 2015 7:29)

Blaueminence
Člen | 31
+
0
-

Jenže já se nechci toho „undefined variable“ zbavit, ale zachytit to, abych zvalidoval ten string s latte.

Jan Tvrdík
Nette guru | 2595
+
0
-

Ty restore_* volání tam jsou proč?

David Grudl
Nette Core | 8218
+
0
-

Error handler se píše takto https://github.com/…-checker.php#L23

Blaueminence
Člen | 31
+
0
-

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

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

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

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