Registrace Latte filtru – Nesting level too deep
- marau
- Člen | 50
Zdravím,
převádím jeden svůj projekt na Nette 2, vše jde zatím bez vétších problémů. Narazil jsem však na jednu věc při kompilaci šablon a registraci latte filtru. Jde o metodu registerFilter ve třídě Template. Registrace filtru skončí chybou Nesting level too deep – recursive dependency? na řádku 174. Problémový je tento kód:
<?php
public function registerFilter($callback)
{
$callback = callback($callback);
if (in_array($callback, $this->filters)) { //zde zahlásí chybu
throw new Nette\InvalidStateException("Filter '$callback' was registered twice.");
}
$this->filters[] = $callback;
return $this;
}
?>
Nezkoumal jsem kód latte filtru, pravděpodobně však dochází k cyklení při kontrole parametrů objektu. V módu strict (třetí parametr in_array TRUE) je vše v pořádku (simulace ===). Nesetkal jste se někdo s tímto problémem?
Díky.
- marau
- Člen | 50
Tak vyřešeno, v jedné částí kódu jsem znovu registroval event onPrepareFilters a došlo tak k dvojí registraci Latte filtru, stejně by mě ale zajímalo, proč to skončilo tou chybou (vím že nesting level se dá nastavit). I při dovjí registraci Latte filteru by to podle mě mělo probublat až na tu vyjímku a neskončit chybou. V mém případě pomohl třetí parametr funkce in_array nastavit na TRUE, ale spíš došlo k pozastavení provádění protože samozřejmě === nemuselo být splněno (nejedná se o stejné objekty).
- marau
- Člen | 50
Tyhle chyby většinou trasuju tak, že před kód vložím napříkad echo $i; a laděnka pak už ukáže celý call stack, samozřejmě je to ještě malinko složité v tom, že chybová funkce může proběhnout několikrát správně než skončí chybou, ale většinou se to dá odtrasovat a vyřešit jedním ifem :) Každopádně to většinou bývá rychlejší než to trasovat vlastními silami.