Configuring Slim PHP with Twig with Reactjs behavioral
<?php
namespace App\Factory;
use App\Factory\Twig\Extensions\TwigCsrfExtension;
use App\Factory\Twig\Extensions\TwigFiltersAndFunctions;
use App\Factory\Twig\Extensions\TwigImageConverterExtension;
use App\Factory\Twig\Extensions\TwigKintExtension;
use Fullpipe\TwigWebpackExtension\WebpackExtension; // <---- this is important !!!
use Psr\Container\ContainerInterface;
use Slim\Csrf\Guard;
use Slim\Views\Twig;
class TwigFactory
{
public $twig;
public function __construct(ContainerInterface $container)
{
$settings = $container->get('settings');
$twigSettings = $settings['twig'];
$options = $twigSettings['options'];
$options['cache'] = $options['cache_enabled'] ? $options['cache_path'] : false;
$twig = Twig::create($twigSettings['paths'], $options);
if ($settings['use_kint'] || $options['debug']) {
$twig->addExtension(new TwigKintExtension);
}
$environment = $twig->getEnvironment();
$twig->addExtension(new TwigFiltersAndFunctions($environment, (array)$settings['assets']));
$twig->addExtension(new TwigImageConverterExtension);
// The path must be absolute.
// e.g. /var/www/example.com/public
$publicPath = PUBLIC_ROOT; // path to public_html folder or which it is in your situation
// Add extension Webpack !!!! very important
$twig->addExtension(new WebpackExtension(
"{$publicPath}/dist/manifest.json", // The manifest file.
$publicPath // The public path
));
// csrf Guard extension
$guard = $container->get(Guard::class);
$twig->addExtension(new TwigCsrfExtension($guard));
$this->twig = $twig;
}
}