Contao 4 Bundle Twig Templates und Bundle Extension

Im Beitrag Contao 4 Bundle (Plugin) erstellen - Backend und Frontend kamen Fragen über das Rendern von Twig und das Auslagern von der Konfiguration auf. Welche ich gern jetzt beantworten möchte.

Ist das Registrieren der Services in der "app/config/config.yml" nötig, oder kann dies direkt im Modul untergebracht werden

Man registriert bequem per Dependency Injection und der Extension-Klasse seine eigenen Services. Dazu legt man im Bundle den Ordner "DependencyInjection" mit der dazu gehörigen Datei "CarBundleExtension.php" an.

class CarBundleExtension extends Extension
{
    public function load(array $mergedConfig, ContainerBuilder $container)
    {
        $loader = new YamlFileLoader(
            $container,
            new FileLocator(__DIR__ . '/../Resources/config')
        );
        $loader->load('services.yml');
    }
}

Damit diese Klasse geladen wird, muss diese in der Bundle-Hauptklasse (XuadCarBundle) mit der Methode getContainerExtensions() geladen werden

class XuadCarBundle extends Bundle
{
    /**
     * Register extension
     * @return \Xuad\CarBundle\DependencyInjection\CarBundleExtension
     */
    public function getContainerExtension()
    {
        return new CarBundleExtension();
    }
}

Jetzt können wir die services.yml Registrierung aus der config.yml löschen (- { resource: "@XuadCarBundle/Resources/config/services.yml" }).

Es fehlt noch das ORM-Mapping (mappings: XuadCarBundle: ~), welches wir umgehen, in dem wir das Automapping aktivieren (auto_mapping: true).

Wie ist möglich die HTML-Ausgabe mittels Twig zu verwirklichen

Eigentlich recht einfach. Dazu dient unser Template "mod_car_list.html5" als Twig-Wrapper:

<div class="<?= $this->class; ?> block"<?= $this->cssID; ?>>
	<?= $this->renderedTwig ?>
</div>

Dazu wird die compile() Methode unseres ModuleCarList-Moduls angepasst:

protected function compile()
{
    $carService = \System::getContainer()->get('xuad_car.service.carservice');
    $carList = $carService->findAll();
    $twigRenderer = \System::getContainer()->get('templating');
    $rendered = $twigRenderer->render('@XuadCar/mod_car_list.twig',
        [
            'carList' => $carList
        ]);
    $this->Template->renderedTwig = $rendered;
}

Der Twig-Renderer rendert jetzt das Twig-Template (Resources/views/mod_car_list.twig) mit der Autoliste.

<div class="car-list">
    {% if carList %}
        <ul>
            {% for car in carList %}
{# Leerzeichen zwischen { {  } } entfernen -> hightlight.js zickt sonst rum #}
                <li>{ { car.getBrand } } { { car.getName } }</li>
            {% endfor %}
        </ul>
    {% endif %}
</div>