|
@@ -33,8 +33,8 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
|
|
|
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
|
|
|
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
|
|
|
use Symfony\Component\DependencyInjection\Loader\DelegatingLoader;
|
|
|
-use Symfony\Component\DependencyInjection\Loader\LoaderResolver;
|
|
|
use Symfony\Component\DependencyInjection\Loader\LoaderInterface;
|
|
|
+use Symfony\Component\DependencyInjection\Loader\LoaderResolver;
|
|
|
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
|
|
|
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
|
|
|
use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
|
|
@@ -43,6 +43,7 @@ use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
|
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
|
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
|
|
use Symfony\Component\HttpKernel\Bundle\BundleInterface;
|
|
|
+use Symfony\Component\HttpKernel\DependencyInjection\Loader\FileLocator;
|
|
|
abstract class Kernel implements KernelInterface
|
|
|
{
|
|
|
protected $bundles;
|
|
@@ -85,7 +86,7 @@ abstract class Kernel implements KernelInterface
|
|
|
}
|
|
|
$this->initializeBundles();
|
|
|
$this->initializeContainer();
|
|
|
- foreach ($this->bundles as $bundle) {
|
|
|
+ foreach ($this->getBundles() as $bundle) {
|
|
|
$bundle->setContainer($this->container);
|
|
|
$bundle->boot();
|
|
|
}
|
|
@@ -94,7 +95,7 @@ abstract class Kernel implements KernelInterface
|
|
|
public function shutdown()
|
|
|
{
|
|
|
$this->booted = false;
|
|
|
- foreach ($this->bundles as $bundle) {
|
|
|
+ foreach ($this->getBundles() as $bundle) {
|
|
|
$bundle->shutdown();
|
|
|
$bundle->setContainer(null);
|
|
|
}
|
|
@@ -105,7 +106,11 @@ abstract class Kernel implements KernelInterface
|
|
|
if (false === $this->booted) {
|
|
|
$this->boot();
|
|
|
}
|
|
|
- return $this->container->get('http_kernel')->handle($request, $type, $catch);
|
|
|
+ return $this->getHttpKernel()->handle($request, $type, $catch);
|
|
|
+ }
|
|
|
+ protected function getHttpKernel()
|
|
|
+ {
|
|
|
+ return $this->container->get('http_kernel');
|
|
|
}
|
|
|
public function getBundles()
|
|
|
{
|
|
@@ -113,9 +118,8 @@ abstract class Kernel implements KernelInterface
|
|
|
}
|
|
|
public function isClassInActiveBundle($class)
|
|
|
{
|
|
|
- foreach ($this->bundles as $bundle) {
|
|
|
- $bundleClass = get_class($bundle);
|
|
|
- if (0 === strpos($class, substr($bundleClass, 0, strrpos($bundleClass, '\\')))) {
|
|
|
+ foreach ($this->getBundles() as $bundle) {
|
|
|
+ if (0 === strpos($class, $bundle->getNamespace())) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
@@ -215,7 +219,7 @@ abstract class Kernel implements KernelInterface
|
|
|
$topMostBundles[$name] = $bundle;
|
|
|
}
|
|
|
}
|
|
|
- if (count($diff = array_diff(array_keys($directChildren), array_keys($this->bundles)))) {
|
|
|
+ if (count($diff = array_values(array_diff(array_keys($directChildren), array_keys($this->bundles))))) {
|
|
|
throw new \LogicException(sprintf('Bundle "%s" extends bundle "%s", which is not registered.', $directChildren[$diff[0]], $diff[0]));
|
|
|
}
|
|
|
$this->bundleMap = array();
|
|
@@ -337,11 +341,11 @@ abstract class Kernel implements KernelInterface
|
|
|
protected function getContainerLoader(ContainerInterface $container)
|
|
|
{
|
|
|
$resolver = new LoaderResolver(array(
|
|
|
- new XmlFileLoader($container),
|
|
|
- new YamlFileLoader($container),
|
|
|
- new IniFileLoader($container),
|
|
|
- new PhpFileLoader($container),
|
|
|
- new ClosureLoader($container),
|
|
|
+ new XmlFileLoader($container, new FileLocator($this)),
|
|
|
+ new YamlFileLoader($container, new FileLocator($this)),
|
|
|
+ new IniFileLoader($container, new FileLocator($this)),
|
|
|
+ new PhpFileLoader($container, new FileLocator($this)),
|
|
|
+ new ClosureLoader($container, new FileLocator($this)),
|
|
|
));
|
|
|
return new DelegatingLoader($resolver);
|
|
|
}
|
|
@@ -403,6 +407,7 @@ class HttpCache implements HttpKernelInterface
|
|
|
protected $store;
|
|
|
protected $request;
|
|
|
protected $esi;
|
|
|
+ protected $esiTtls;
|
|
|
public function __construct(HttpKernelInterface $kernel, StoreInterface $store, Esi $esi = null, array $options = array())
|
|
|
{
|
|
|
$this->store = $store;
|
|
@@ -440,6 +445,7 @@ class HttpCache implements HttpKernelInterface
|
|
|
if (HttpKernelInterface::MASTER_REQUEST === $type) {
|
|
|
$this->traces = array();
|
|
|
$this->request = $request;
|
|
|
+ $this->esiTtls = array();
|
|
|
}
|
|
|
$path = $request->getPathInfo();
|
|
|
if ($qs = $request->getQueryString()) {
|
|
@@ -458,8 +464,28 @@ class HttpCache implements HttpKernelInterface
|
|
|
if (HttpKernelInterface::MASTER_REQUEST === $type && $this->options['debug']) {
|
|
|
$response->headers->set('X-Symfony-Cache', $this->getLog());
|
|
|
}
|
|
|
+ if (null !== $this->esi) {
|
|
|
+ $this->addEsiTtl($response);
|
|
|
+ if ($request === $this->request) {
|
|
|
+ $this->updateResponseCacheControl($response);
|
|
|
+ }
|
|
|
+ }
|
|
|
return $response;
|
|
|
}
|
|
|
+ protected function addEsiTtl(Response $response)
|
|
|
+ {
|
|
|
+ $this->esiTtls[] = $response->isValidateable() ? -1 : $response->getTtl();
|
|
|
+ }
|
|
|
+ protected function updateResponseCacheControl(Response $response)
|
|
|
+ {
|
|
|
+ $ttl = min($this->esiTtls);
|
|
|
+ if (-1 === $ttl) {
|
|
|
+ $response->headers->set('Cache-Control', 'no-cache, must-revalidate');
|
|
|
+ } else {
|
|
|
+ $response->setSharedMaxAge($ttl);
|
|
|
+ $response->setMaxAge(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
protected function pass(Request $request, $catch = false)
|
|
|
{
|
|
|
$this->record($request, 'pass');
|
|
@@ -1459,14 +1485,34 @@ class Request
|
|
|
public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null)
|
|
|
{
|
|
|
$dup = clone $this;
|
|
|
- $dup->initialize(
|
|
|
- null !== $query ? $query : $this->query->all(),
|
|
|
- null !== $request ? $request : $this->request->all(),
|
|
|
- null !== $attributes ? $attributes : $this->attributes->all(),
|
|
|
- null !== $cookies ? $cookies : $this->cookies->all(),
|
|
|
- null !== $files ? $files : $this->files->all(),
|
|
|
- null !== $server ? $server : $this->server->all()
|
|
|
- );
|
|
|
+ if ($query !== null) {
|
|
|
+ $dup->query = new ParameterBag($query);
|
|
|
+ }
|
|
|
+ if ($request !== null) {
|
|
|
+ $dup->request = new ParameterBag($request);
|
|
|
+ }
|
|
|
+ if ($attributes !== null) {
|
|
|
+ $dup->attributes = new ParameterBag($attributes);
|
|
|
+ }
|
|
|
+ if ($cookies !== null) {
|
|
|
+ $dup->cookies = new ParameterBag($cookies);
|
|
|
+ }
|
|
|
+ if ($files !== null) {
|
|
|
+ $dup->files = new FileBag($files);
|
|
|
+ }
|
|
|
+ if ($server !== null) {
|
|
|
+ $dup->server = new ServerBag($server);
|
|
|
+ $dup->headers = new HeaderBag($dup->server->getHeaders());
|
|
|
+ }
|
|
|
+ $this->languages = null;
|
|
|
+ $this->charsets = null;
|
|
|
+ $this->acceptableContentTypes = null;
|
|
|
+ $this->pathInfo = null;
|
|
|
+ $this->requestUri = null;
|
|
|
+ $this->baseUrl = null;
|
|
|
+ $this->basePath = null;
|
|
|
+ $this->method = null;
|
|
|
+ $this->format = null;
|
|
|
return $dup;
|
|
|
}
|
|
|
public function __clone()
|