You want to fully tak advantage of symfony in your Prestashop application? Use the symfony kernel! By default, the $kernel variable is only available in the Backoffice section, but hereβs a tuto on how to use it also on the Frontoffice. Once the kernel is set up, you can use any symfony services, such as Doctrine, Twig, Monolog! Awesome π
Letβs see first how to do it on the backoffice, because itβs a one-liner, and then in the front office, because it requires a little more work. And at the end, weβll see how to wrap it up in a module, to be always available!
In the backoffice
global $kernel;
// that's it!! Now you can use
$kernel->getContainer()->get('twig')->render(...)
In the frontoffice
The kernel is not set up in the front, but it can be booted with:
require_once _PS_ROOT_DIR_.'/app/AppKernel.php';
$env = 'prod';// or you can use _PS_MODE_DEV_ ? 'dev' : 'prod';
$debug = false;// or you can use _PS_MODE_DEV_ ? true : false;
$kernel = new \AppKernel($env, $debug);
$kernel->boot();
// that's it!! Now you can use
$kernel->getContainer()->get('twig')->render(...)
Refactorisation in a module to be available anywhere
//modules/mymodule/MyModule.php
class MyModule extends Module
{
public static $kernel = null;
public static $doctrine = null;
public static function getKernel()
{
// if the singleton doesn't exist
if (!self::$kernel) {
// try to load it globally (for backoffice pages)
global $kernel;
if ($kernel) {
self::$kernel = $kernel;
}
// otherwise create it manually
else {
require_once _PS_ROOT_DIR_ . "/app/AppKernel.php";
$env = "prod"; //_PS_MODE_DEV_ ? 'dev' : 'prod';
$debug = false; //_PS_MODE_DEV_ ? true : false;
self::$kernel = new \AppKernel($env, $debug);
self::$kernel->boot();
}
}
return self::$kernel;
}
public static function getDoctrine()
{
if (!self::$doctrine) {
self::$doctrine = self::getKernel()->getContainer()->get("doctrine")->getManager();
}
return self::$doctrine;
}
public static function get($service)
{
return self::getKernel()->getContainer()->get($service);
}
}
And use it anywhere:
MyModule::getDoctrine()
MyModule::get('twig')
MyModule::getKernel()->getContainer()->get('twig')