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

David Grudl
Nette Core | 8227
+
0
-

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

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