Ver código fonte

refactored routing management (it's now possible to disable the default routing)

 * removed the Kernel::registerRoutes() method
 * added a router entry in <web:config> (replaces the registerRoutes() method)
       <web:config>
           <web:router resource="%kernel.root_dir%/config/routing.xml" />
       </web:config>
 * refactored routing configuration in its own routing.xml file (leverages the new routing component API),
   which is loaded only if <web:router> is defined in the configuration
Fabien Potencier 15 anos atrás
pai
commit
4e3e86c4a7

+ 11 - 1
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/WebExtension.php

@@ -30,6 +30,7 @@ class WebExtension extends Extension
     protected $resources = array(
         'templating' => 'templating.xml',
         'web'        => 'web.xml',
+        'routing'    => 'routing.xml',
         // validation.xml conflicts with the naming convention for XML
         // validation mapping files, so call it validator.xml
         'validation' => 'validator.xml',
@@ -52,8 +53,9 @@ class WebExtension extends Extension
      */
     public function configLoad($config, ContainerBuilder $container)
     {
+        $loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
+
         if (!$container->hasDefinition('controller_manager')) {
-            $loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
             $loader->load($this->resources['web']);
         }
 
@@ -61,6 +63,14 @@ class WebExtension extends Extension
             $container->setParameter('debug.file_link_format', 'txmt://open?url=file://%%f&line=%%l');
         }
 
+        if (isset($config['router'])) {
+            if (!$container->hasDefinition('router')) {
+                $loader->load($this->resources['routing']);
+            }
+
+            $container->setParameter('routing.resource', $config['router']['resource']);
+        }
+
         if (isset($config['toolbar']) && $config['toolbar']) {
             $config['profiler'] = true;
         }

+ 51 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://www.symfony-project.org/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd">
+
+    <parameters>
+        <parameter key="router.class">Symfony\Components\Routing\Router</parameter>
+        <parameter key="routing.loader.class">Symfony\Components\Routing\Loader\DelegatingLoader</parameter>
+        <parameter key="routing.resolver.class">Symfony\Bundle\FrameworkBundle\Routing\LoaderResolver</parameter>
+        <parameter key="routing.loader.xml.class">Symfony\Components\Routing\Loader\XmlFileLoader</parameter>
+        <parameter key="routing.loader.yml.class">Symfony\Components\Routing\Loader\YamlFileLoader</parameter>
+        <parameter key="routing.loader.php.class">Symfony\Components\Routing\Loader\PhpFileLoader</parameter>
+    </parameters>
+
+    <services>
+        <service id="routing.resolver" class="%routing.resolver.class%">
+            <argument type="service" id="service_container" />
+        </service>
+
+        <service id="routing.loader.xml" class="%routing.loader.xml.class%">
+            <annotation name="routing.loader" />
+            <argument>%kernel.bundle_dirs%</argument>
+        </service>
+
+        <service id="routing.loader.yml" class="%routing.loader.yml.class%">
+            <annotation name="routing.loader" />
+            <argument>%kernel.bundle_dirs%</argument>
+        </service>
+
+        <service id="routing.loader.php" class="%routing.loader.php.class%">
+            <annotation name="routing.loader" />
+            <argument>%kernel.bundle_dirs%</argument>
+        </service>
+
+        <service id="routing.loader" class="%routing.loader.class%">
+            <argument type="service" id="routing.resolver" />
+        </service>
+
+        <service id="router" class="%router.class%">
+            <argument type="service" id="routing.loader" />
+            <argument>%routing.resource%</argument>
+            <argument type="collection">
+                <argument key="cache_dir">%kernel.cache_dir%</argument>
+                <argument key="debug">%kernel.debug%</argument>
+                <argument key="matcher_cache_class">%kernel.name%UrlMatcher</argument>
+                <argument key="generator_cache_class">%kernel.name%UrlGenerator</argument>
+            </argument>
+        </service>
+    </services>
+</container>

+ 8 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

@@ -10,11 +10,19 @@
   <xsd:element name="user" type="user" />
 
   <xsd:complexType name="config">
+      <xsd:sequence>
+        <xsd:element name="router" type="router" minOccurs="0" maxOccurs="1" />
+      </xsd:sequence>
+
     <xsd:attribute name="ide" type="xsd:string" />
     <xsd:attribute name="profiler" type="xsd:boolean" />
     <xsd:attribute name="toolbar" type="xsd:boolean" />
   </xsd:complexType>
 
+  <xsd:complexType name="router">
+    <xsd:attribute name="resource" type="xsd:string" />
+  </xsd:complexType>
+
   <xsd:complexType name="user">
     <xsd:sequence>
       <xsd:element name="session" type="session" minOccurs="0" maxOccurs="1" />

+ 0 - 14
src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml

@@ -8,7 +8,6 @@
         <parameter key="request_listener.class">Symfony\Bundle\FrameworkBundle\RequestListener</parameter>
         <parameter key="controller_manager.class">Symfony\Bundle\FrameworkBundle\Controller\ControllerManager</parameter>
         <parameter key="controller_loader_listener.class">Symfony\Components\HttpKernel\Controller\ControllerLoaderListener</parameter>
-        <parameter key="router.class">Symfony\Components\Routing\Router</parameter>
         <parameter key="response_listener.class">Symfony\Components\HttpKernel\ResponseListener</parameter>
         <parameter key="exception_listener.class">Symfony\Bundle\FrameworkBundle\Controller\ExceptionListener</parameter>
         <parameter key="exception_listener.controller">FrameworkBundle:Exception:exception</parameter>
@@ -35,19 +34,6 @@
             <argument type="service" id="logger" on-invalid="ignore" />
         </service>
 
-        <service id="router" class="%router.class%">
-            <argument type="collection">
-                <argument type="service" id="kernel" />
-                <argument>registerRoutes</argument>
-            </argument>
-            <argument type="collection">
-                <argument key="cache_dir">%kernel.cache_dir%</argument>
-                <argument key="debug">%kernel.debug%</argument>
-                <argument key="matcher_cache_class">%kernel.name%UrlMatcher</argument>
-                <argument key="generator_cache_class">%kernel.name%UrlGenerator</argument>
-            </argument>
-        </service>
-
         <service id="esi" class="%esi.class%" />
 
         <service id="esi_listener" class="%esi_listener.class%">

+ 0 - 8
src/Symfony/Bundle/FrameworkBundle/Resources/skeleton/application/xml/Kernel.php

@@ -4,7 +4,6 @@ require_once __DIR__.'/../src/autoload.php';
 
 use Symfony\Framework\Kernel;
 use Symfony\Components\DependencyInjection\Loader\XmlFileLoader as ContainerLoader;
-use Symfony\Components\Routing\Loader\XmlFileLoader as RoutingLoader;
 use Symfony\Components\DependencyInjection\ContainerBuilder;
 
 use Symfony\Framework\Bundle\KernelBundle;
@@ -57,11 +56,4 @@ class {{ class }}Kernel extends Kernel
 
         return $container;
     }
-
-    public function registerRoutes()
-    {
-        $loader = new RoutingLoader($this->getBundleDirs());
-
-        return $loader->load(__DIR__.'/config/routing.xml');
-    }
 }

+ 3 - 1
src/Symfony/Bundle/FrameworkBundle/Resources/skeleton/application/xml/config/config.xml

@@ -22,7 +22,9 @@
         error_handler_level="null"
     />
 
-    <web:config />
+    <web:config>
+        <web:router resource="%kernel.root_dir%/config/routing.xml" />
+    </web:config>
 
     <web:templating
         escaping="htmlspecialchars"

+ 0 - 8
src/Symfony/Bundle/FrameworkBundle/Resources/skeleton/application/yaml/Kernel.php

@@ -4,7 +4,6 @@ require_once __DIR__.'/../src/autoload.php';
 
 use Symfony\Framework\Kernel;
 use Symfony\Components\DependencyInjection\Loader\YamlFileLoader as ContainerLoader;
-use Symfony\Components\Routing\Loader\YamlFileLoader as RoutingLoader;
 use Symfony\Components\DependencyInjection\ContainerBuilder;
 
 use Symfony\Framework\Bundle\KernelBundle;
@@ -57,11 +56,4 @@ class {{ class }}Kernel extends Kernel
 
         return $container;
     }
-
-    public function registerRoutes()
-    {
-        $loader = new RoutingLoader($this->getBundleDirs());
-
-        return $loader->load(__DIR__.'/config/routing.yml');
-    }
 }

+ 2 - 1
src/Symfony/Bundle/FrameworkBundle/Resources/skeleton/application/yaml/config/config.yml

@@ -5,7 +5,8 @@ kernel.config:
     charset:             UTF-8
     error_handler_level: null
 
-web.config: ~
+web.config:
+    router: { resource: "%kernel.root_dir%/config/routing.yml" }
 
 web.templating:
     escaping:       htmlspecialchars

+ 65 - 0
src/Symfony/Bundle/FrameworkBundle/Routing/LoaderResolver.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace Symfony\Bundle\FrameworkBundle\Routing;
+
+use Symfony\Components\Routing\Loader\LoaderResolver as BaseLoaderResolver;
+use Symfony\Components\DependencyInjection\ContainerInterface;
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * This loader resolver automatically registers routing loaders from
+ * the container.
+ *
+ * If also lazy-loads them.
+ *
+ * @package    Symfony
+ * @subpackage Bundle_FrameworkBundle
+ * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
+ */
+class LoaderResolver extends BaseLoaderResolver
+{
+    protected $services;
+    protected $container;
+
+    /**
+     * Constructor.
+     *
+     * @param \Symfony\Components\DependencyInjection\ContainerInterface $container A ContainerInterface instance
+     * @param \Symfony\Components\Routing\Loader\LoaderInterface[]       $loaders An array of loaders
+     */
+    public function __construct(ContainerInterface $container, array $loaders = array())
+    {
+        parent::__construct($loaders);
+
+        $this->container = $container;
+        foreach ($container->findAnnotatedServiceIds('routing.loader') as $id => $attributes) {
+            $this->services[] = $id;
+        }
+    }
+
+    /**
+     * Returns a loader able to load the resource.
+     *
+     * @param mixed  $resource A resource
+     *
+     * @return Symfony\Components\Routing\Loader\LoaderInterface A LoaderInterface instance
+     */
+    public function resolve($resource)
+    {
+        if (count($this->services)) {
+            while ($id = array_shift($this->services)) {
+                $this->addLoader($this->container->get($id));
+            }
+        }
+
+        return parent::resolve($resource);
+    }
+}

+ 0 - 2
src/Symfony/Framework/Kernel.php

@@ -85,8 +85,6 @@ abstract class Kernel implements HttpKernelInterface, \Serializable
 
     abstract public function registerContainerConfiguration();
 
-    abstract public function registerRoutes();
-
     /**
      * Checks whether the current kernel has been booted or not.
      *