Vlastní makro vyžaduje službu

vojtamares
Člen | 26
+
0
-

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 | 1028
+
+3
-

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 | 8132
+
+4
-

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.

vojtamares
Člen | 26
+
0
-

Ok, díky!