Skip to content

Instantly share code, notes, and snippets.

@leopro
Created September 4, 2012 14:58
Show Gist options
  • Save leopro/3621967 to your computer and use it in GitHub Desktop.
Save leopro/3621967 to your computer and use it in GitHub Desktop.
Runtime controller extension
<?php
namespace Edimotive\SaloneBundle\Service;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Edimotive\SaloneBundle\Service\ControllerExtendableInterface;
use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Edimotive\SaloneBundle\Service\CustomControllerManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
class ControllerExtendableListener
{
protected $container;
protected $manager;
public function __construct(ContainerInterface $container, CustomControllerManager $manager)
{
$this->container = $container;
$this->manager = $manager;
}
public function onKernelController(FilterControllerEvent $event)
{
$controllers = $event->getController();
if (!is_array($controllers)) {
return;
}
$controller = $controllers[0];
$method = $controllers[1];
if (!$controller instanceof ControllerExtendableInterface) {
return;
}
$name = $event->getRequest()->get($controller->getParameterName());
$customController = $this->manager->getController($name, $method);
if (null === $customController || !$customController instanceof ContainerAwareInterface) {
return;
}
$customController->setContainer($this->container);
$event->setController(array($customController, $method));
}
}
<?php
namespace Edimotive\SaloneBundle\Service;
class CustomControllerManager
{
protected $customControllers;
public function __construct($customControllers = array())
{
$this->customControllers = $customControllers;
}
public function getController($name, $method)
{
$customControllers = $this->customControllers;
if (array_key_exists($name, $customControllers)) {
if (class_exists($customControllers[$name])) {
$controller = new $customControllers[$name];
if (method_exists($controller, $method)) {
return $controller;
}
}
}
return null;
}
}
parameters:
custom_controllers:
custom_controller: Acme\MyBundle\Controller\MyController
services:
acme.controller_extendable:
class: Acme\MyBundle\Service\ControllerExtendableListener
arguments: ["@service_container", "@omniauto.custom_controller_manger"]
tags:
- { name: kernel.event_listener, event: kernel.controller }
acme.custom_controller_manger:
class: Acme\MyBundle\Service\CustomControllerManager
arguments: [%custom_controllers%]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment