Vlastní makro vyžaduje službu

- vojtamares
 - Člen | 26
 
Ahoj
píšu si malé makro na feature flagging a potřebuju si tahat repozitář jako službu, která by provedla kontrolu jestli to je zapnuté nebo ne.
// FeatureRepository interface
interface IFeatureRepository
{
	public function accessible(string $feature): bool;
	/**
	 * @return array<string, bool>
	 */
	public function all();
	public function turnOn(string $feature): void;
	public function turnOff(string $feature): void;
}
A tady samotné makro
final class FeatureMacros extends MacroSet
{
	public static function install(Compiler $compiler): void
	{
		$me = new static($compiler);
		$me->addMacro('feature', [$me, 'macroFeature'], [$me, 'macroEndFeature']);
	}
	/**
	 * {feature ...}
	 */
	public function macroFeature(MacroNode $node, PhpWriter $writer)
	{
		if ($node->modifiers) {
			throw new CompileException(sprintf('Modifiers are not allowed in %s', $node->getNotation()));
		}
		return $writer->write('if ($repository->accessible(%node.args)) {');
	}
	/**
	 * {/feature}
	 */
	public function macroEndFeature(MacroNode $node, PhpWriter $writer)
	{
		if ($node->data->capture && $node->args === '') {
			throw new CompileException('Missing feature name in {feature} macro.');
		}
		return $writer->write('}');
	}
}
Je to jen jakýsi smart wrapper nad if makrem. Je pravda že by mi stačilo
si do šablony přidat proměnnou $repository a obejít to přes
{if $repository->accessible('my-feature')} ... {/if}, ale to
nechci, takže bych raději měl takovéhle chytré makro, které by to dělalo
za mě. Ale nevím jestli z té třídy maker můžu udělat službu, krom toho
se makra ukládají v compile time a ne v runtime pokud vím, jen to
vygeneruje PHP kód.
Někdo nějaké rady? Díky

- jiri.pudil
 - Nette Blogger | 1034
 
Ahoj, vyřešil jsem obdobný problém tím, že si do Latte\Engine
potřebnou službu přidávám
jako provider. Je pak v každé šabloně dostupná v
$this->global, takže stačí v makru vyprodukovat kód, který
si tam
pro ni sáhne.

- David Grudl
 - Nette Core | 8285
 
Přesně na to providery jsou. Důležité je je pojmenovat dostatečně unikátně, ve tvaru jako namespaceProvider, aby nedošlo ke kolizím.