The TwigInjectionBundle allows to inject twig templates through the event behavior.
TwigInjectionBundle requires Symfony 3.4 or higher.
Require the bundle in your composer.json
file:
{
"require": {
"intaro/twig-injection-bundle": "^2.0"
}
}
Register the bundle in AppKernel
:
// app/AppKernel.php
public function registerBundles()
{
$bundles = [
//...
new Intaro\TwigInjectionBundle\IntaroTwigInjectionBundle(),
];
//...
}
Install the bundle:
$ composer update intaro/twig-injection-bundle
- Add
{{ inject() }}
calling in template:
{{ inject('twig.injection.event.name', { parameter1: 'some-value', parameter2: some_object }) }}
-
Prepare controller action which you want to render or template which you want to include.
-
Define Listener which will inject
include
orrender
calling:
<?php
namespace Acme\DemoBundle\EventListener;
use Intaro\TwigInjectionBundle\Event\TwigInjectEvent;
use Intaro\TwigInjectionBundle\Event\TwigInjectRender;
class TwigInjectionListener
{
public function onSomeEvent(TwigInjectEvent $event)
{
$parameters = $event->getParameters();
if (!isset($parameters['parameter1']) || 'some-value' !== $parameters['parameters1']) {
return;
}
$render = new TwigInjectRender(
'AcmeDemoBundle:DefaultController:index',
[ 'object' => $parameters['parameters2'] ]
);
$event->addInjection($render);
$include = new TwigInjectInclude('AcmeDemoBundle:Default:someTemplate.html.twig');
$event->addInjection($include);
}
}
- Register the listener:
services:
acme_demo.twig_injection.listener:
class: Acme\DemoBundle\EventListener\TwigInjectionListener
tags:
- { name: kernel.event_listener, event: twig.injection.event.name, method: onSomeEvent }