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 | 1029
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 | 8218
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.