1<?php
2
3/*
4 * This file is part of the Silex framework.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Silex\Provider;
13
14use Pimple\Container;
15use Pimple\ServiceProviderInterface;
16use Silex\Api\EventListenerProviderInterface;
17use Symfony\Component\EventDispatcher\EventDispatcherInterface;
18use Symfony\Component\HttpKernel\Fragment\FragmentHandler;
19use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
20use Symfony\Component\HttpKernel\Fragment\EsiFragmentRenderer;
21use Symfony\Component\HttpKernel\Fragment\HIncludeFragmentRenderer;
22use Symfony\Component\HttpKernel\EventListener\FragmentListener;
23use Symfony\Component\HttpKernel\Kernel;
24use Symfony\Component\HttpKernel\UriSigner;
25
26/**
27 * HttpKernel Fragment integration for Silex.
28 *
29 * @author Fabien Potencier <fabien@symfony.com>
30 */
31class HttpFragmentServiceProvider implements ServiceProviderInterface, EventListenerProviderInterface
32{
33    public function register(Container $app)
34    {
35        $app['fragment.handler'] = function ($app) {
36            return new FragmentHandler($app['request_stack'], $app['fragment.renderers'], $app['debug']);
37        };
38
39        $app['fragment.renderer.inline'] = function ($app) {
40            $renderer = new InlineFragmentRenderer($app['kernel'], $app['dispatcher']);
41            $renderer->setFragmentPath($app['fragment.path']);
42
43            return $renderer;
44        };
45
46        $app['fragment.renderer.hinclude'] = function ($app) {
47            $renderer = new HIncludeFragmentRenderer(null, $app['uri_signer'], $app['fragment.renderer.hinclude.global_template'], $app['charset']);
48            $renderer->setFragmentPath($app['fragment.path']);
49
50            return $renderer;
51        };
52
53        $app['fragment.renderer.esi'] = function ($app) {
54            $renderer = new EsiFragmentRenderer($app['http_cache.esi'], $app['fragment.renderer.inline'], $app['uri_signer']);
55            $renderer->setFragmentPath($app['fragment.path']);
56
57            return $renderer;
58        };
59
60        $app['fragment.listener'] = function ($app) {
61            return new FragmentListener($app['uri_signer'], $app['fragment.path']);
62        };
63
64        $app['uri_signer'] = function ($app) {
65            return new UriSigner($app['uri_signer.secret']);
66        };
67
68        $app['uri_signer.secret'] = md5(__DIR__);
69        $app['fragment.path'] = '/_fragment';
70        $app['fragment.renderer.hinclude.global_template'] = null;
71        $app['fragment.renderers'] = function ($app) {
72            $renderers = array($app['fragment.renderer.inline'], $app['fragment.renderer.hinclude']);
73
74            if (isset($app['http_cache.esi'])) {
75                $renderers[] = $app['fragment.renderer.esi'];
76            }
77
78            return $renderers;
79        };
80    }
81
82    public function subscribe(Container $app, EventDispatcherInterface $dispatcher)
83    {
84        $dispatcher->addSubscriber($app['fragment.listener']);
85    }
86}
87