Latte 3: pozor na chybu při psaní vlastní značky
- David Grudl
- Nette Core | 8227
Pokud vytváříte vlastní značku v Latte 3, napíšete její parsovací
funkci (create
) a třídu představující uzel v AST
(MyNode
).
class MyNode extends StatementNode
{
public ExpressionNode $expression;
public static function create(Latte\Compiler\Tag $tag): self
{
$tag->expectArguments();
$node = new self;
$node->expression = $tag->parser->parseExpression();
return $node;
}
}
Pokud má tento uzel své poduzly (proměnná $expression
), je
vhodné jim dát viditelnost public, aby jejich obsah mohl být
modifikován v dalších krocích zpracování.
Ale především je nutné implementovat metodu
getIterator()
, aby se poduzly zpřístupnily pro
procházení AST!
public function &getIterator(): \Generator
{
yield $this->expression;
}
Jinak může vzniknout bezpečnostní díra. Například sandbox režim nebude schopen mít takový poduzel pod kontrolou a tedy nebude schopen zajistit, že se tam nebudou volat zakázané metody.
Vlastně si říkám, že jsem měl metodu Node::getIterator() dát spíš jako abstract, aby ji programátor nemohl jen tak opominout. Teď to změnit by samozřejmě představovalo BC break, ale možná by to dávalo smysl. Co myslíte?
- Marek Bartoš
- Nette Blogger | 1274
BC breaky nemá asi nikdo rád, ale jde o bezpečnost a nejde ani o hard BC break – o po opravě iteratoru makra budou fungovat ve starších verzích. Takže proč ne? Kdo to nechce řešit zkopíruje 3 řádky a má hotovo