* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpKernel\DependencyInjection; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpKernel\Fragment\FragmentHandler; /** * Lazily loads fragment renderers from the dependency injection container. * * @author Fabien Potencier */ class LazyLoadingFragmentHandler extends FragmentHandler { private $container; private $rendererIds = array(); /** * Constructor. * * RequestStack will become required in 3.0. * * @param ContainerInterface $container A container * @param RequestStack $requestStack The Request stack that controls the lifecycle of requests * @param bool $debug Whether the debug mode is enabled or not */ public function __construct(ContainerInterface $container, $requestStack = null, $debug = false) { $this->container = $container; if ((null !== $requestStack && !$requestStack instanceof RequestStack) || $debug instanceof RequestStack) { $tmp = $debug; $debug = $requestStack; $requestStack = func_num_args() < 3 ? null : $tmp; @trigger_error('The '.__METHOD__.' method now requires a RequestStack to be given as second argument as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED); } elseif (!$requestStack instanceof RequestStack) { @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED); } parent::__construct($requestStack, array(), $debug); } /** * Adds a service as a fragment renderer. * * @param string $name The service name * @param string $renderer The render service id */ public function addRendererService($name, $renderer) { $this->rendererIds[$name] = $renderer; } /** * {@inheritdoc} */ public function render($uri, $renderer = 'inline', array $options = array()) { if (isset($this->rendererIds[$renderer])) { $this->addRenderer($this->container->get($this->rendererIds[$renderer])); unset($this->rendererIds[$renderer]); } return parent::render($uri, $renderer, $options); } }