Latte 3: pozor na chybu při psaní vlastní značky

- David Grudl
- Nette Core | 8285
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 | 1313
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