Jak ověřit Latte syntax, zachytit všechny chyby před include

ludek
Člen | 78
+
0
-

Zdravím, potřeboval bych před vložením Latte šablony ověřit, jestli je správně napsaná,
abych v případě syntaktické chyby zabránil zobrazení 500 Server Error (ParseError, syntax error na DEV stroji).

Šablona

{if $syntaxOK}
    {include $page} {* << $page je .latte soubor, jestli má vadnou syntax, nenačítat a zobrazit chybu *}
{else}
	CHYBA!
{/if}

Napadlo mě jen zkusit to předem zkompilovat:
Presenter:

	$page = $this->context->parameters['wwwDir'].'/pages/page1.latte';

	$this->template->syntaxOK = TRUE;

	    $latte = new \Latte\Engine;
	    try {
			$test = $latte->compile($page); //< jde to zkompilovat?
	    } catch (\Exception $e) {
			$this->flashMessage('<strong>CHYBA:</strong> (' . $e->getMessage() . ').', 'danger');
			$this->template->syntaxOK = FALSE;
	    }

funguje to, ALE některé chyby zachytím, některé ne. Např.

{<něco> vyhodí výjimku "Malformed macro"
{<něco>} projde a skončí to až na {include} "syntax error, unexpected '<'", to znamená 500 Server Error.
→ source file: echo LR\Filters::escapeHtmlText(<'něco'>)

To druhé prostě projde přes compile() a spadne to až na {include $page} při renderování šablony.

Můžete mi prosím poradit, jak zachytit všechny chyby v Latte šabloně dřív než bude includovaná?

EDIT: použité verze: PHP 7.3.6, nette/application v3.0.0, latte/latte v2.5.1

Díky.

Editoval ludek (27. 9. 2019 13:17)

David Matějka
Moderator | 6427
+
0
-

půjde to složitě, viz třeba https://forum.nette.org/…ouziti-tracy

ludek
Člen | 78
+
+1
-

Možné řešení:

Spadne to na render metodě. Takže jednou se zachytává výjimka a jednou ParseError.

$page = $this->context->parameters['wwwDir'].'/pages/page1.latte';

$latte = new \Latte\Engine;

$syntaxOK = TRUE;

try {
    $test = $latte->compile($page); // jde to zkompilovat?
} catch (\Exception $e) {
    $this->flashMessage('<strong>CHYBA:</strong> (' . $e->getMessage() . ').', 'danger');
    $syntaxOK = FALSE;
}

if ($syntaxOK) {
	try {
	    $test = $latte->renderToString($page); // jde to vyrenderovat?
	} catch (\ParseError $e) {
	    $this->flashMessage('<strong>CHYBA:</strong> (' . $e->getMessage() . ').', 'danger');
	    $syntaxOK = FALSE;
	}
}

$this->template->syntaxOK = $syntaxOK;