/** * Templating engines currently supported: * - PHP * - Twig * - Smarty * - Mustache. * * @param ServiceManager $serviceManager * * @throws \RuntimeException */ public function configureServiceManager(ServiceManager $serviceManager) { $config = $serviceManager->get('Config'); $appRootDir = $config['parameters']['app.root_dir']; $appCacheDir = $config['parameters']['app.cache_dir']; $appCharset = $config['parameters']['app.charset']; // The "framework.templating" option is deprecated. Please replace it with "framework.view" $config = $this->processConfiguration($config); // these are the templating engines currently supported // @todo - this needs to come from the app config. $knownEngineIds = array('php', 'smarty', 'twig', 'mustache', 'plates', 'latte'); // these are the engines selected by the user $engineIds = isset($config['engines']) ? $config['engines'] : array('php'); // filter templating engines $engineIds = array_intersect($engineIds, $knownEngineIds); if (empty($engineIds)) { throw new \RuntimeException(sprintf('At least one templating engine should be defined in your app config (in $config[\'view.engines\']). These are the available ones: "%s". Example: "$config[\'templating.engines\'] = array(\'%s\');"', implode('", ', $knownEngineIds), implode("', ", $knownEngineIds))); } /* * Templating Locator. */ $serviceManager->setFactory('templating.locator', function ($serviceManager) use($appCacheDir) { return new TemplateLocator($serviceManager->get('file_locator'), $appCacheDir); }); /* * Templating Name Parser. */ $serviceManager->setFactory('templating.name_parser', function ($serviceManager) { return new TemplateNameParser($serviceManager->get('modulemanager')); }); /* * Filesystem Loader. */ $serviceManager->setFactory('templating.loader.filesystem', function ($serviceManager) { return new FileSystemLoader($serviceManager->get('templating.locator')); }); /* * Templating assets helper. */ $serviceManager->setFactory('templating.helper.assets', function ($serviceManager) { return new AssetsHelper($serviceManager->get('request')->getBasePath()); }); /* * Templating globals. */ $serviceManager->setFactory('templating.globals', function ($serviceManager) { return new GlobalVariables($serviceManager->get('servicemanager')); }); /* * PHP Engine. * * TODO: Migrate to Symfony\Bundle\FrameworkBundle\Templating\PhpEngine */ $serviceManager->setFactory('templating.engine.php', function ($serviceManager) use($appCharset) { $engine = new PhpEngine($serviceManager->get('templating.name_parser'), $serviceManager->get('templating.loader'), array(new SlotsHelper(), $serviceManager->get('templating.helper.assets'), new RouterHelper($serviceManager->get('router')), new SessionHelper($serviceManager->get('session')))); $engine->addGlobal('app', $serviceManager->get('templating.globals')); $engine->setCharset($appCharset); return $engine; }); /* * Twig Engine */ $serviceManager->setFactory('templating.engine.twig', function ($serviceManager) { if (!class_exists('Twig_Environment')) { throw new \Exception('PPI\\Framework\\TwigModule not found. Composer require: ppi/twig-module'); } $twigEnvironment = new \Twig_Environment(new \PPI\Framework\View\Twig\Loader\FileSystemLoader($serviceManager->get('templating.locator'), $serviceManager->get('templating.name_parser'))); // Add some twig extension $twigEnvironment->addExtension(new \PPI\Framework\View\Twig\Extension\AssetsExtension($serviceManager->get('templating.helper.assets'))); $twigEnvironment->addExtension(new \PPI\Framework\View\Twig\Extension\RouterExtension($serviceManager->get('router'))); return new \PPI\Framework\View\Twig\TwigEngine($twigEnvironment, $serviceManager->get('templating.name_parser'), $serviceManager->get('templating.locator'), $serviceManager->get('templating.globals')); }); /* * Smarty Engine. */ $serviceManager->setFactory('templating.engine.smarty', function ($serviceManager) use($appCacheDir) { if (!class_exists('NoiseLabs\\Bundle\\SmartyBundle\\SmartyEngine')) { throw new \Exception('PPI\\Framework\\SmartyModule not found. Composer require: ppi/smarty-module'); } $cacheDir = $appCacheDir . DIRECTORY_SEPARATOR . 'smarty'; $smartyEngine = new \PPI\Framework\View\Smarty\SmartyEngine(new \Smarty(), $serviceManager->get('templating.locator'), $serviceManager->get('templating.name_parser'), $serviceManager->get('templating.loader'), array('cache_dir' => $cacheDir . DIRECTORY_SEPARATOR . 'cache', 'compile_dir' => $cacheDir . DIRECTORY_SEPARATOR . 'templates_c'), $serviceManager->get('templating.globals'), $serviceManager->get('logger')); // Add some SmartyBundle extensions $smartyEngine->addExtension(new SmartyAssetsExtension($serviceManager->get('templating.helper.assets'))); $smartyEngine->addExtension(new SmartyRouterExtension($serviceManager->get('router'))); return $smartyEngine; }); // Mustache Engine $serviceManager->setFactory('templating.engine.mustache', function ($serviceManager, $appCacheDir) { if (!class_exists('Mustache_Engine')) { throw new \Exception('PPI\\Framework\\MustacheModule not found. Composer require: ppi/mustache-module'); } $rawMustacheEngine = new \Mustache_Engine(array('loader' => new MustacheFileSystemLoader($serviceManager->get('templating.locator'), $serviceManager->get('templating.name_parser')), 'cache' => $appCacheDir . DIRECTORY_SEPARATOR . 'mustache')); return new MustacheEngine($rawMustacheEngine, $serviceManager->get('templating.name_parser')); }); /* * Delegating Engine. */ $serviceManager->setFactory('templating.engine.delegating', function ($serviceManager) use($engineIds) { $delegatingEngine = new DelegatingEngine(); // @todo - lazy load this foreach ($engineIds as $id) { $delegatingEngine->addEngine($serviceManager->get('templating.engine.' . $id)); } return $delegatingEngine; }); $serviceManager->setAlias('templating', 'templating.engine.delegating'); }