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')