Skip to content

Commit

Permalink
Updates for SensioFrameworkExtraBundle latest version(^5.2) (#4348)
Browse files Browse the repository at this point in the history
* routing annotations deprecation fix

* Twig_Extension deprecations fix

* Update configurations

* Add legacy implementation for templates backward compatibility

* review code changes

* Fix tests

* review fixes

* Refactored template engine in LegacyTemplateListener

* Symfony 4 compatibility
  • Loading branch information
dvesh3 authored and brusch committed May 14, 2019
1 parent 8b21bdd commit bf41705
Show file tree
Hide file tree
Showing 21 changed files with 388 additions and 46 deletions.
@@ -0,0 +1,50 @@
<?php
/**
* Pimcore
*
* This source file is available under two different licenses:
* - GNU General Public License version 3 (GPLv3)
* - Pimcore Enterprise License (PEL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
* @license http://www.pimcore.org/license GPLv3 and PEL
*/

namespace Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler;

use Pimcore\Bundle\CoreBundle\EventListener\LegacyTemplateListener;
use Pimcore\Bundle\CoreBundle\Templating\LegacyTemplateGuesser;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

class LegacyTemplatePass implements CompilerPassInterface
{
/**
* Replace SensioFrameworkExtraBundle template guesser & view listener with our implementation to support PHP templates
*
* @inheritDoc
*/
public function process(ContainerBuilder $container)
{
if ($container->hasDefinition('sensio_framework_extra.view.guesser')) {
$definition = $container->getDefinition('sensio_framework_extra.view.guesser');
$definition
->setPublic(true)
->setClass(LegacyTemplateGuesser::class)
->addArgument(new Reference('templating'));
}


if ($container->hasDefinition('sensio_framework_extra.view.listener')) {
$definition = $container->getDefinition('sensio_framework_extra.view.listener');
$definition
->setClass(LegacyTemplateListener::class)
->addMethodCall('setTemplateEngine', [
new Reference('templating')
]);
}
}
}
@@ -0,0 +1,41 @@
<?php
/**
* Pimcore
*
* This source file is available under two different licenses:
* - GNU General Public License version 3 (GPLv3)
* - Pimcore Enterprise License (PEL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
* @license http://www.pimcore.org/license GPLv3 and PEL
*/

namespace Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler;

use Pimcore\Routing\Loader\AnnotatedRouteControllerLoader;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
* Set annotation loader to our own implementation normalizing admin routes: converts the prefix
* pimcore_pimcoreadmin_ to just pimcore_admin_
*
*/
class RoutingLoaderPass implements CompilerPassInterface
{
/**
* Replace Annotated Routing loader with your implementation to normalizes autogenerated admin routes
* @inheritDoc
*/
public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('routing.loader.annotation')) {
return;
}

$definition = $container->getDefinition('routing.loader.annotation');
$definition->setClass(AnnotatedRouteControllerLoader::class);
}
}
25 changes: 0 additions & 25 deletions bundles/CoreBundle/DependencyInjection/PimcoreCoreExtension.php
Expand Up @@ -25,7 +25,6 @@
use Pimcore\Migrations\Configuration\ConfigurationFactory;
use Pimcore\Model\Document\Tag\Loader\PrefixLoader as DocumentTagPrefixLoader;
use Pimcore\Model\Factory;
use Pimcore\Routing\Loader\AnnotatedRouteControllerLoader;
use Pimcore\Sitemap\EventListener\SitemapGeneratorListener;
use Pimcore\Targeting\ActionHandler\DelegatingActionHandler;
use Pimcore\Targeting\DataLoaderInterface;
Expand Down Expand Up @@ -81,8 +80,6 @@ public function loadInternal(array $config, ContainerBuilder $container)
// TODO only extract what we need as parameter?
$container->setParameter('pimcore.config', $config);

$this->setAnnotationRouteControllerLoader($container);

$loader = new YamlFileLoader(
$container,
new FileLocator(__DIR__ . '/../Resources/config')
Expand Down Expand Up @@ -502,28 +499,6 @@ private function addContextRoutes(ContainerBuilder $container, array $config)
}
}

/**
* Set annotation loader to our own implementation normalizing admin routes: converts the prefix
* pimcore_pimcoreadmin_ to just pimcore_admin_
*
* @param ContainerBuilder $container
*/
private function setAnnotationRouteControllerLoader(ContainerBuilder $container)
{
$parameter = 'sensio_framework_extra.routing.loader.annot_class.class';

// make sure the parameter is not dropped by sensio framework extra bundle
// if this exception is thrown, implement the class override in a compiler pass
if (!$container->hasParameter($parameter)) {
throw new RuntimeException(sprintf(
'The sensio framework extra bundle removed support for the "%s" parameter',
$parameter
));
}

$container->setParameter($parameter, AnnotatedRouteControllerLoader::class);
}

/**
* The security component disallows definition of firewalls and access_control entries from different files to enforce
* security. However this limits our possibilities how to provide a security config for the admin area while making
Expand Down
120 changes: 120 additions & 0 deletions bundles/CoreBundle/EventListener/LegacyTemplateListener.php
@@ -0,0 +1,120 @@
<?php

namespace Pimcore\Bundle\CoreBundle\EventListener;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Templating\TemplateGuesser;
use Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener;
use Symfony\Component\Templating\EngineInterface;

/**
* Provides backward compatibility for PHP templates
*
*/
class LegacyTemplateListener extends TemplateListener
{
/**
* @var EngineInterface
*/
private $templateEngine;

/**
* @return EngineInterface
*/
public function getTemplateEngine(): EngineInterface
{
return $this->templateEngine;
}

/**
* @param EngineInterface $templateEngine
*/
public function setTemplateEngine(EngineInterface $templateEngine): void
{
$this->templateEngine = $templateEngine;
}

/**
* @inheritdoc
*/
public function onKernelView(GetResponseForControllerResultEvent $event)
{

/* @var Template $template */
$request = $event->getRequest();
$template = $request->attributes->get('_template');

if (!$template instanceof Template) {
return;
}


$parameters = $event->getControllerResult();
$owner = $template->getOwner();
list($controller, $action) = $owner;

// when the annotation declares no default vars and the action returns
// null, all action method arguments are used as default vars
if (null === $parameters) {
$parameters = $this->resolveDefaultParameters($request, $template, $controller, $action);
}

// attempt to render the actual response
$templating = $this->getTemplateEngine();

if ($template->isStreamable()) {
$callback = function () use ($templating, $template, $parameters) {
return $templating->stream($template->getTemplate(), $parameters);
};

$event->setResponse(new StreamedResponse($callback));
}

// make sure the owner (controller+dependencies) is not cached or stored elsewhere
$template->setOwner([]);

$event->setResponse($templating->renderResponse($template->getTemplate(), $parameters));
}

/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER => ['onKernelController', -128],
KernelEvents::VIEW => 'onKernelView',
];
}

private function resolveDefaultParameters(Request $request, Template $template, $controller, $action)
{
$parameters = [];
$arguments = $template->getVars();

if (0 === \count($arguments)) {
$r = new \ReflectionObject($controller);

$arguments = [];
foreach ($r->getMethod($action)->getParameters() as $param) {
$arguments[] = $param;
}
}

// fetch the arguments of @Template.vars or everything if desired
// and assign them to the designated template
foreach ($arguments as $argument) {
if ($argument instanceof \ReflectionParameter) {
$parameters[$name = $argument->getName()] = !$request->attributes->has($name) && $argument->isDefaultValueAvailable() ? $argument->getDefaultValue() : $request->attributes->get($name);
} else {
$parameters[$argument] = $request->attributes->get($argument);
}
}

return $parameters;
}
}
Expand Up @@ -104,14 +104,7 @@ public function onKernelView(GetResponseForControllerResultEvent $event)

$template = new Template([]);
$template->setOwner($controller);
$template->setEngine($engine);
$templateReference = $guesser->guessTemplateName($controller, $request, $engine);

// Only AppBundle should use templates inside app folder
if ($templateReference->get('bundle') === 'AppBundle') {
$templateReference->set('bundle', '');
}

$template->setTemplate($templateReference);

// inject Template annotation into the request - will be used by SensioFrameworkExtraBundle
Expand Down
4 changes: 4 additions & 0 deletions bundles/CoreBundle/PimcoreCoreBundle.php
Expand Up @@ -18,6 +18,7 @@
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\CacheCollectorPass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\DebugStopwatchPass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\DoctrineMigrationsParametersPass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\LegacyTemplatePass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\LongRunningHelperPass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\MonologPsrLogMessageProcessorPass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\MonologPublicLoggerPass;
Expand All @@ -27,6 +28,7 @@
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\PimcoreGlobalTemplatingVariablesPass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\RegisterImageOptimizersPass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\RegisterMaintenanceTaskPass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\RoutingLoaderPass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\ServiceControllersPass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\SessionConfiguratorPass;
use Pimcore\Bundle\CoreBundle\DependencyInjection\Compiler\TargetingOverrideHandlersPass;
Expand Down Expand Up @@ -86,5 +88,7 @@ public function build(ContainerBuilder $container)
$container->addCompilerPass(new WorkflowPass());
$container->addCompilerPass(new RegisterImageOptimizersPass());
$container->addCompilerPass(new RegisterMaintenanceTaskPass());
$container->addCompilerPass(new RoutingLoaderPass());
$container->addCompilerPass(new LegacyTemplatePass());
}
}
4 changes: 4 additions & 0 deletions bundles/CoreBundle/Resources/config/pimcore/default.yml
Expand Up @@ -499,3 +499,7 @@ presta_sitemap:
lastmod: ~
priority: ~
changefreq: ~

sensio_framework_extra:
router:
annotations: false

0 comments on commit bf41705

Please sign in to comment.