WEBD-325-45/week-03/project/libraries/src/Service/TemplatingProvider.php

312 lines
8.9 KiB
PHP

<?php
/**
* Joomla! Framework Website
*
* @copyright Copyright (C) 2014 - 2017 Open Source Matters, Inc. All rights reserved.
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
*/
namespace Octoleo\CMS\Service;
use Joomla\Application\AbstractApplication;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Octoleo\CMS\Asset\MixPathPackage;
use Octoleo\CMS\Renderer\ApplicationContext;
use Octoleo\CMS\Renderer\FrameworkExtension;
use Octoleo\CMS\Renderer\FrameworkTwigRuntime;
use Joomla\Preload\PreloadManager;
use Joomla\Renderer\RendererInterface;
use Joomla\Renderer\TwigRenderer;
use Symfony\Component\Asset\Packages;
use Symfony\Component\Asset\PathPackage;
use Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy;
use Symfony\Component\Asset\VersionStrategy\JsonManifestVersionStrategy;
use Twig\Cache\CacheInterface;
use Twig\Cache\FilesystemCache;
use Twig\Cache\NullCache;
use Twig\Environment;
use Twig\Extension\DebugExtension;
use Twig\Extension\ProfilerExtension;
use Twig\Loader\FilesystemLoader;
use Twig\Loader\LoaderInterface;
use Twig\Profiler\Profile;
use Twig\RuntimeLoader\ContainerRuntimeLoader;
/**
* Templating service provider
* source: https://github.com/joomla/framework.joomla.org/blob/master/src/Service/TemplatingProvider.php
*/
class TemplatingProvider implements ServiceProviderInterface
{
/**
* Registers the service provider with a DI container.
*
* @param Container $container The DI container.
*
* @return void
*/
public function register(Container $container): void
{
$container->alias(Packages::class, 'asset.packages')
->share('asset.packages', [$this, 'getAssetPackagesService'], true);
$container->alias(RendererInterface::class, 'renderer')
->alias(TwigRenderer::class, 'renderer')
->share('renderer', [$this, 'getRendererService'], true);
$container->alias(CacheInterface::class, 'twig.cache')
->alias(\Twig_CacheInterface::class, 'twig.cache')
->share('twig.cache', [$this, 'getTwigCacheService'], true);
$container->alias(Environment::class, 'twig.environment')
->alias(\Twig_Environment::class, 'twig.environment')
->share('twig.environment', [$this, 'getTwigEnvironmentService'], true);
$container->alias(DebugExtension::class, 'twig.extension.debug')
->alias(\Twig_Extension_Debug::class, 'twig.extension.debug')
->share('twig.extension.debug', [$this, 'getTwigExtensionDebugService'], true);
$container->alias(FrameworkExtension::class, 'twig.extension.framework')
->share('twig.extension.framework', [$this, 'getTwigExtensionFrameworkService'], true);
// This service cannot be protected as it is decorated when the debug bar is available
$container->alias(ProfilerExtension::class, 'twig.extension.profiler')
->alias(\Twig_Extension_Profiler::class, 'twig.extension.profiler')
->share('twig.extension.profiler', [$this, 'getTwigExtensionProfilerService']);
$container->alias(LoaderInterface::class, 'twig.loader')
->alias(\Twig_LoaderInterface::class, 'twig.loader')
->share('twig.loader', [$this, 'getTwigLoaderService'], true);
$container->alias(Profile::class, 'twig.profiler.profile')
->alias(\Twig_Profiler_Profile::class, 'twig.profiler.profile')
->share('twig.profiler.profile', [$this, 'getTwigProfilerProfileService'], true);
$container->alias(FrameworkTwigRuntime::class, 'twig.runtime.framework')
->share('twig.runtime.framework', [$this, 'getTwigRuntimeFrameworkService'], true);
$container->alias(ContainerRuntimeLoader::class, 'twig.runtime.loader')
->alias(\Twig_ContainerRuntimeLoader::class, 'twig.runtime.loader')
->share('twig.runtime.loader', [$this, 'getTwigRuntimeLoaderService'], true);
$this->tagTwigExtensions($container);
}
/**
* Get the `asset.packages` service
*
* @param Container $container The DI container.
*
* @return Packages
*/
public function getAssetPackagesService(Container $container): Packages
{
/** @var AbstractApplication $app */
$app = $container->get(AbstractApplication::class);
$context = new ApplicationContext($app);
$mediaPath = $app->get('uri.media.path', '/media/');
$defaultPackage = new PathPackage($mediaPath, new EmptyVersionStrategy, $context);
$mixStrategy = new MixPathPackage(
$defaultPackage,
$mediaPath,
new JsonManifestVersionStrategy(LPATH_ROOT . '/media/mix-manifest.json'),
$context
);
return new Packages(
$defaultPackage,
[
'mix' => $mixStrategy,
]
);
}
/**
* Get the `renderer` service
*
* @param Container $container The DI container.
*
* @return RendererInterface
*/
public function getRendererService(Container $container): RendererInterface
{
return new TwigRenderer($container->get('twig.environment'));
}
/**
* Get the `twig.cache` service
*
* @param Container $container The DI container.
*
* @return \Twig_CacheInterface
*/
public function getTwigCacheService(Container $container): \Twig_CacheInterface
{
/** @var \Joomla\Registry\Registry $config */
$config = $container->get('config');
// Pull down the renderer config
$cacheEnabled = $config->get('template.cache.enabled', false);
$cachePath = $config->get('template.cache.path', 'cache/twig');
$debug = $config->get('template.debug', false);
if ($debug === false && $cacheEnabled !== false)
{
return new FilesystemCache(LPATH_ROOT . '/' . $cachePath);
}
return new NullCache;
}
/**
* Get the `twig.environment` service
*
* @param Container $container The DI container.
*
* @return Environment
*/
public function getTwigEnvironmentService(Container $container): Environment
{
/** @var \Joomla\Registry\Registry $config */
$config = $container->get('config');
$debug = $config->get('template.debug', false);
$environment = new Environment(
$container->get('twig.loader'),
['debug' => $debug]
);
// Add the runtime loader
$environment->addRuntimeLoader($container->get('twig.runtime.loader'));
// Set up the environment's caching service
$environment->setCache($container->get('twig.cache'));
// Add the Twig extensions
$environment->setExtensions($container->getTagged('twig.extension'));
// Add a global tracking the debug states
$environment->addGlobal('appDebug', $config->get('debug', false));
$environment->addGlobal('fwDebug', $debug);
return $environment;
}
/**
* Get the `twig.extension.debug` service
*
* @param Container $container The DI container.
*
* @return DebugExtension
*/
public function getTwigExtensionDebugService(Container $container): DebugExtension
{
return new DebugExtension;
}
/**
* Get the `twig.extension.framework` service
*
* @param Container $container The DI container.
*
* @return FrameworkExtension
*/
public function getTwigExtensionFrameworkService(Container $container): FrameworkExtension
{
return new FrameworkExtension;
}
/**
* Get the `twig.extension.profiler` service
*
* @param Container $container The DI container.
*
* @return ProfilerExtension
*/
public function getTwigExtensionProfilerService(Container $container): ProfilerExtension
{
return new ProfilerExtension($container->get('twig.profiler.profile'));
}
/**
* Get the `twig.loader` service
*
* @param Container $container The DI container.
*
* @return \Twig_LoaderInterface
*/
public function getTwigLoaderService(Container $container): \Twig_LoaderInterface
{
return new FilesystemLoader([LPATH_TEMPLATES]);
}
/**
* Get the `twig.profiler.profile` service
*
* @param Container $container The DI container.
*
* @return Profile
*/
public function getTwigProfilerProfileService(Container $container): Profile
{
return new Profile;
}
/**
* Get the `twig.runtime.framework` service
*
* @param Container $container The DI container.
*
* @return FrameworkTwigRuntime
*/
public function getTwigRuntimeFrameworkService(Container $container): FrameworkTwigRuntime
{
return new FrameworkTwigRuntime(
$container->get(AbstractApplication::class),
$container->get(PreloadManager::class),
LPATH_ROOT . '/media/sri-manifest.json'
);
}
/**
* Get the `twig.runtime.loader` service
*
* @param Container $container The DI container.
*
* @return ContainerRuntimeLoader
*/
public function getTwigRuntimeLoaderService(Container $container): ContainerRuntimeLoader
{
return new ContainerRuntimeLoader($container);
}
/**
* Tag services which are Twig extensions
*
* @param Container $container The DI container.
*
* @return void
*/
private function tagTwigExtensions(Container $container): void
{
/** @var \Joomla\Registry\Registry $config */
$config = $container->get('config');
$debug = $config->get('template.debug', false);
$twigExtensions = ['twig.extension.framework'];
if ($debug)
{
$twigExtensions[] = 'twig.extension.debug';
}
$container->tag('twig.extension', $twigExtensions);
}
}