Give you the possibility to add code in a twig template dynamically.
First you need to add shapecode/twig-template-event-bundle
to composer.json
:
composer require shapecode/twig-template-event-bundle
... or ...
{
"require": {
"shapecode/twig-template-event-bundle": "~5.0"
}
}
If you dont use Symfony Flex you have to add ShapecodeTwigTemplateEventBundle
to your bundles.php
:
<?php
// config/bundles.php
return [
// ...
Shapecode\Bundle\TwigTemplateEventBundle\ShapecodeTwigTemplateEventBundle::class => ['all' => true],
];
Now you can set events in twig templates:
{{ event('test') }}
And listen to them with an event listener:
services:
# twig events
Shapecode\Bundle\TwigTemplateEventBundle\EventListener\TestTwigEventListener: ~
<?php
namespace Shapecode\Bundle\TwigTemplateEventBundle\EventListener;
use Shapecode\Bundle\TwigTemplateEventBundle\Event\Code\TwigEventString;
use Shapecode\Bundle\TwigTemplateEventBundle\Event\Code\TwigEventInclude;
use Shapecode\Bundle\TwigTemplateEventBundle\Event\TwigTemplateEvent;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
#[AsEventListener]
class TestTwigEventListener
{
public function __invoke(TwigTemplateEvent $event): void
{
if ($event->getEventName() == 'foo') {
// to add a string
$event->addCode(
new TwigEventString(
'hello {{ world }}',
[
'world' => 'World'
],
10 // default is 0. The higher the number the later the code will be executed. The lower the number the earlier the code will be executed.
)
);
}
if ($event->getEventName() == 'bar') {
// to include a twig template
$event->addCode(
new TwigEventInclude(
'@App/Layout/Header/_search.html.twig',
[
'world' => 'World'
],
)
);
}
}
}