浏览代码

Merge remote branch 'symfony/master'

Ray 14 年之前
父节点
当前提交
73f70ae53c
共有 17 个文件被更改,包括 180 次插入89 次删除
  1. 12 12
      src/Symfony/Bundle/DoctrineAbstractBundle/DependencyInjection/AbstractDoctrineExtension.php
  2. 0 1
      src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php
  3. 0 3
      src/Symfony/Bundle/DoctrineMigrationsBundle/DependencyInjection/DoctrineMigrationsExtension.php
  4. 0 2
      src/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php
  5. 3 1
      src/Symfony/Bundle/SecurityBundle/DependencyInjection/Configuration.php
  6. 21 5
      src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/HttpBasicFactory.php
  7. 24 5
      src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/HttpDigestFactory.php
  8. 4 0
      src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/X509Factory.php
  9. 18 10
      src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php
  10. 20 31
      src/Symfony/Bundle/SecurityBundle/Resources/config/security_listeners.xml
  11. 28 14
      src/Symfony/Bundle/SecurityBundle/Resources/views/Collector/security.html.twig
  12. 1 1
      src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/SecurityExtensionTest.php
  13. 0 2
      src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/WebProfilerExtension.php
  14. 1 1
      src/Symfony/Component/Config/Definition/VariableNode.php
  15. 1 0
      src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
  16. 8 1
      src/Symfony/Component/HttpFoundation/ApacheRequest.php
  17. 39 0
      tests/Symfony/Tests/Component/HttpFoundation/ApacheRequestTest.php

+ 12 - 12
src/Symfony/Bundle/DoctrineAbstractBundle/DependencyInjection/AbstractDoctrineExtension.php

@@ -37,10 +37,10 @@ abstract class AbstractDoctrineExtension extends Extension
     protected $drivers = array();
 
     /*
-     * @param array $entityManager A configured ORM entity manager.
-     * @param ContainerBuilder $container A ContainerBuilder instance
+     * @param array            $objectManager A configured object manager.
+     * @param ContainerBuilder $container     A ContainerBuilder instance
      */
-    protected function loadMappingInformation(array $objectManager, $container)
+    protected function loadMappingInformation(array $objectManager, ContainerBuilder $container)
     {
         if (isset($objectManager['mappings'])) {
             foreach ($objectManager['mappings'] as $mappingName => $mappingConfig) {
@@ -111,7 +111,7 @@ abstract class AbstractDoctrineExtension extends Extension
     /**
      * Register the mapping driver configuration for later use with the object managers metadata driver chain.
      *
-     * @param array $mappingConfig
+     * @param array  $mappingConfig
      * @param string $mappingName
      * @return void
      */
@@ -135,11 +135,11 @@ abstract class AbstractDoctrineExtension extends Extension
      *
      * @param array            $bundleConfig
      * @param \ReflectionClass $bundle
-     * @param Container        $container
+     * @param ContainerBuilder $container    A ContainerBuilder instance
      *
      * @return array|false
      */
-    protected function getMappingDriverBundleConfigDefaults(array $bundleConfig, \ReflectionClass $bundle, $container)
+    protected function getMappingDriverBundleConfigDefaults(array $bundleConfig, \ReflectionClass $bundle, ContainerBuilder $container)
     {
         $bundleDir = dirname($bundle->getFilename());
 
@@ -171,10 +171,10 @@ abstract class AbstractDoctrineExtension extends Extension
     /**
      * Register all the collected mapping information with the object manager by registering the appropriate mapping drivers.
      *
-     * @param array $objectManager
-     * @param Container $container
+     * @param array            $objectManager
+     * @param ContainerBuilder $container     A ContainerBuilder instance
      */
-    protected function registerMappingDrivers($objectManager, $container)
+    protected function registerMappingDrivers($objectManager, ContainerBuilder $container)
     {
         // configure metadata driver for each bundle based on the type of mapping files found
         if ($container->hasDefinition($this->getObjectManagerElementName($objectManager['name'] . '_metadata_driver'))) {
@@ -220,7 +220,7 @@ abstract class AbstractDoctrineExtension extends Extension
     /**
      * Assertion if the specified mapping information is valid.
      *
-     * @param array $mappingConfig
+     * @param array  $mappingConfig
      * @param string $objectManagerName
      */
     protected function assertValidMappingConfiguration(array $mappingConfig, $objectManagerName)
@@ -246,8 +246,8 @@ abstract class AbstractDoctrineExtension extends Extension
     /**
      * Detects what metadata driver to use for the supplied directory.
      *
-     * @param string $dir A directory path
-     * @param ContainerBuilder $container A ContainerBuilder configuration
+     * @param string           $dir       A directory path
+     * @param ContainerBuilder $container A ContainerBuilder instance
      *
      * @return string|null A metadata driver short name, if one can be detected
      */

+ 0 - 1
src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php

@@ -16,7 +16,6 @@ use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Definition;
 use Symfony\Component\DependencyInjection\Reference;
-use Symfony\Component\Config\Resource\FileResource;
 use Symfony\Bundle\DoctrineAbstractBundle\DependencyInjection\AbstractDoctrineExtension;
 use Symfony\Component\Config\FileLocator;
 use Symfony\Component\Config\Definition\Processor;

+ 0 - 3
src/Symfony/Bundle/DoctrineMigrationsBundle/DependencyInjection/DoctrineMigrationsExtension.php

@@ -11,11 +11,8 @@
 
 namespace Symfony\Bundle\DoctrineMigrationsBundle\DependencyInjection;
 
-use Symfony\Component\Config\FileLocator;
 use Symfony\Component\Config\Definition\Processor;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Reference;
-use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
 use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 
 /**

+ 0 - 2
src/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php

@@ -11,13 +11,11 @@
 
 namespace Symfony\Bundle\DoctrineMongoDBBundle\DependencyInjection;
 
-use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Alias;
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\DependencyInjection\Definition;
-use Symfony\Component\Config\Resource\FileResource;
 use Symfony\Component\Config\FileLocator;
 use Symfony\Bundle\DoctrineAbstractBundle\DependencyInjection\AbstractDoctrineExtension;
 use Symfony\Component\Config\Definition\Processor;

+ 3 - 1
src/Symfony/Bundle/SecurityBundle/DependencyInjection/Configuration.php

@@ -156,7 +156,9 @@ class Configuration
                             ->prototype('scalar')->end()
                         ->end()
                     ->end()
-                    ->booleanNode('anonymous')->defaultFalse()->end()
+                    ->arrayNode('anonymous')
+                        ->scalarNode('key')->defaultValue(uniqid())->end()
+                    ->end()
                     ->arrayNode('switch_user')
                         ->scalarNode('provider')->end()
                         ->scalarNode('parameter')->defaultValue('_switch_user')->end()

+ 21 - 5
src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/HttpBasicFactory.php

@@ -33,16 +33,16 @@ class HttpBasicFactory implements SecurityFactoryInterface
             ->setArgument(2, $id)
         ;
 
+        // entry point
+        $entryPointId = $this->createEntryPoint($container, $id, $config, $defaultEntryPoint);
+
         // listener
         $listenerId = 'security.authentication.listener.basic.'.$id;
         $listener = $container->setDefinition($listenerId, new DefinitionDecorator('security.authentication.listener.basic'));
         $listener->setArgument(2, $id);
+        $listener->setArgument(3, new Reference($entryPointId));
 
-        if (null === $defaultEntryPoint) {
-            $defaultEntryPoint = 'security.authentication.basic_entry_point';
-        }
-
-        return array($provider, $listenerId, $defaultEntryPoint);
+        return array($provider, $listenerId, $entryPointId);
     }
 
     public function getPosition()
@@ -59,6 +59,22 @@ class HttpBasicFactory implements SecurityFactoryInterface
     {
         $builder
             ->scalarNode('provider')->end()
+            ->scalarNode('realm')->defaultValue('Secured Area')->end()
         ;
     }
+
+    protected function createEntryPoint($container, $id, $config, $defaultEntryPoint)
+    {
+        if (null !== $defaultEntryPoint) {
+            return $defaultEntryPoint;
+        }
+
+        $entryPointId = 'security.authentication.basic_entry_point.'.$id;
+        $container
+            ->setDefinition($entryPointId, new DefinitionDecorator('security.authentication.basic_entry_point'))
+            ->addArgument($config['realm'])
+        ;
+
+        return $entryPointId;
+    }
 }

+ 24 - 5
src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/HttpDigestFactory.php

@@ -33,16 +33,17 @@ class HttpDigestFactory implements SecurityFactoryInterface
             ->setArgument(2, $id)
         ;
 
+        // entry point
+        $entryPointId = $this->createEntryPoint($container, $id, $config, $defaultEntryPoint);
+
         // listener
         $listenerId = 'security.authentication.listener.digest.'.$id;
         $listener = $container->setDefinition($listenerId, new DefinitionDecorator('security.authentication.listener.digest'));
+        $listener->setArgument(1, new Reference($userProvider));
         $listener->setArgument(2, $id);
+        $listener->setArgument(3, new Reference($entryPointId));
 
-        if (null === $defaultEntryPoint) {
-            $defaultEntryPoint = 'security.authentication.digest_entry_point';
-        }
-
-        return array($provider, $listenerId, $defaultEntryPoint);
+        return array($provider, $listenerId, $entryPointId);
     }
 
     public function getPosition()
@@ -59,6 +60,24 @@ class HttpDigestFactory implements SecurityFactoryInterface
     {
         $builder
             ->scalarNode('provider')->end()
+            ->scalarNode('realm')->defaultValue('Secured Area')->end()
+            ->scalarNode('key')->cannotBeEmpty()->end()
         ;
     }
+
+    protected function createEntryPoint($container, $id, $config, $defaultEntryPoint)
+    {
+        if (null !== $defaultEntryPoint) {
+            return $defaultEntryPoint;
+        }
+
+        $entryPointId = 'security.authentication.digest_entry_point.'.$id;
+        $container
+            ->setDefinition($entryPointId, new DefinitionDecorator('security.authentication.digest_entry_point'))
+            ->addArgument($config['realm'])
+            ->addArgument($config['key'])
+        ;
+
+        return $entryPointId;
+    }
 }

+ 4 - 0
src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/X509Factory.php

@@ -38,6 +38,8 @@ class X509Factory implements SecurityFactoryInterface
         $listenerId = 'security.authentication.listener.x509.'.$id;
         $listener = $container->setDefinition($listenerId, new DefinitionDecorator('security.authentication.listener.x509'));
         $listener->setArgument(2, $id);
+        $listener->setArgument(3, $config['user']);
+        $listener->setArgument(4, $config['credentials']);
 
         return array($provider, $listenerId, $defaultEntryPoint);
     }
@@ -56,6 +58,8 @@ class X509Factory implements SecurityFactoryInterface
     {
         $builder
             ->scalarNode('provider')->end()
+            ->scalarNode('user')->defaultValue('SSL_CLIENT_S_DN_Email')->end()
+            ->scalarNode('credentials')->defaultValue('SSL_CLIENT_S_DN')->end()
         ;
     }
 }

+ 18 - 10
src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php

@@ -12,19 +12,14 @@
 namespace Symfony\Bundle\SecurityBundle\DependencyInjection;
 
 use Symfony\Component\Config\Definition\Processor;
-use Symfony\Component\Config\Definition\Builder\TreeBuilder;
 use Symfony\Component\DependencyInjection\DefinitionDecorator;
 use Symfony\Component\DependencyInjection\Alias;
 use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
-use Symfony\Component\Config\Resource\FileResource;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\DependencyInjection\Parameter;
-use Symfony\Component\DependencyInjection\Definition;
-use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
 use Symfony\Component\Config\FileLocator;
-use Symfony\Component\HttpFoundation\RequestMatcher;
 
 /**
  * SecurityExtension.
@@ -61,7 +56,7 @@ class SecurityExtension extends Extension
         $config = $processor->process($tree, $configs);
 
         // load services
-        $loader = new XmlFileLoader($container, new FileLocator(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config')));
+        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
         $loader->load('security.xml');
         $loader->load('security_listeners.xml');
         $loader->load('security_rememberme.xml');
@@ -109,7 +104,7 @@ class SecurityExtension extends Extension
 
     private function aclLoad($config, ContainerBuilder $container)
     {
-        $loader = new XmlFileLoader($container, new FileLocator(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config')));
+        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
         $loader->load('security_acl.xml');
 
         if (isset($config['connection'])) {
@@ -346,8 +341,21 @@ class SecurityExtension extends Extension
 
         // Anonymous
         if (isset($firewall['anonymous'])) {
-            $listeners[] = new Reference('security.authentication.listener.anonymous');
-            $authenticationProviders[] = 'security.authentication.provider.anonymous';
+            $listenerId = 'security.authentication.listener.anonymous.'.$id;
+            $container
+                ->setDefinition($listenerId, new DefinitionDecorator('security.authentication.listener.anonymous'))
+                ->setArgument(1, $firewall['anonymous']['key'])
+            ;
+
+            $listeners[] = new Reference($listenerId);
+
+            $providerId = 'security.authentication.provider.anonymous.'.$id;
+            $container
+                ->setDefinition($providerId, new DefinitionDecorator('security.authentication.provider.anonymous'))
+                ->setArgument(0, $firewall['anonymous']['key'])
+            ;
+
+            $authenticationProviders[] = $providerId;
             $hasListeners = true;
         }
 
@@ -535,7 +543,7 @@ class SecurityExtension extends Extension
         // load service templates
         $c = new ContainerBuilder();
         $parameterBag = $container->getParameterBag();
-        $loader = new XmlFileLoader($c, new FileLocator(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config')));
+        $loader = new XmlFileLoader($c, new FileLocator(__DIR__.'/../Resources/config'));
         $loader->load('security_factories.xml');
 
         // load user-created listener factories

+ 20 - 31
src/Symfony/Bundle/SecurityBundle/Resources/config/security_listeners.xml

@@ -14,19 +14,14 @@
 
         <parameter key="security.authentication.listener.basic.class">Symfony\Component\Security\Http\Firewall\BasicAuthenticationListener</parameter>
         <parameter key="security.authentication.basic_entry_point.class">Symfony\Component\Security\Http\EntryPoint\BasicAuthenticationEntryPoint</parameter>
-        <parameter key="security.authentication.basic_entry_point.realm">Symfony2</parameter>
 
         <parameter key="security.authentication.listener.digest.class">Symfony\Component\Security\Http\Firewall\DigestAuthenticationListener</parameter>
         <parameter key="security.authentication.digest_entry_point.class">Symfony\Component\Security\Http\EntryPoint\DigestAuthenticationEntryPoint</parameter>
-        <parameter key="security.authentication.digest_entry_point.realm">Symfony2</parameter>
-        <parameter key="security.authentication.digest_entry_point.key">SomethingUnique</parameter>
 
         <parameter key="security.authentication.listener.x509.class">Symfony\Component\Security\Http\Firewall\X509AuthenticationListener</parameter>
-        <parameter key="security.authentication.x509.user">SSL_CLIENT_S_DN_Email</parameter>
-        <parameter key="security.authentication.x509.credentials">SSL_CLIENT_S_DN</parameter>
 
         <parameter key="security.authentication.listener.anonymous.class">Symfony\Component\Security\Http\Firewall\AnonymousAuthenticationListener</parameter>
-        
+
         <parameter key="security.authentication.switchuser_listener.class">Symfony\Component\Security\Http\Firewall\SwitchUserListener</parameter>
 
         <parameter key="security.logout_listener.class">Symfony\Component\Security\Http\Firewall\LogoutListener</parameter>
@@ -41,31 +36,25 @@
         <parameter key="security.authentication.provider.dao.class">Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider</parameter>
         <parameter key="security.authentication.provider.pre_authenticated.class">Symfony\Component\Security\Core\Authentication\Provider\PreAuthenticatedAuthenticationProvider</parameter>
 
-        <parameter key="security.authentication.provider.anonymous">Symfony\Component\Security\Core\Authentication\Provider\AnonymousAuthenticationProvider</parameter>
-        <parameter key="security.anonymous.key">SomeRandomValue</parameter>
+        <parameter key="security.authentication.provider.anonymous.class">Symfony\Component\Security\Core\Authentication\Provider\AnonymousAuthenticationProvider</parameter>
     </parameters>
-    
+
     <services>
         <service id="security.authentication.listener.anonymous" class="%security.authentication.listener.anonymous.class%" public="false">
             <argument type="service" id="security.context" />
-            <argument>%security.anonymous.key%</argument>
+            <argument /> <!-- Key -->
             <argument type="service" id="logger" on-invalid="null" />
         </service>
 
-        <service id="security.authentication.provider.anonymous" class="%security.authentication.provider.anonymous%" public="false">
-            <argument>%security.anonymous.key%</argument>
+        <service id="security.authentication.provider.anonymous" class="%security.authentication.provider.anonymous.class%" public="false">
+            <argument /> <!-- Key -->
         </service>
 
         <service id="security.authentication.retry_entry_point" class="%security.authentication.retry_entry_point.class%" public="false" />
 
-        <service id="security.authentication.basic_entry_point" class="%security.authentication.basic_entry_point.class%" public="false">
-            <argument>%security.authentication.basic_entry_point.realm%</argument>
-        </service>
+        <service id="security.authentication.basic_entry_point" class="%security.authentication.basic_entry_point.class%" public="false" />
 
-        <service id="security.authentication.digest_entry_point" class="%security.authentication.digest_entry_point.class%" public="false">
-            <argument>%security.authentication.digest_entry_point.realm%</argument>
-            <argument>%security.authentication.digest_entry_point.key%</argument>
-        </service>
+        <service id="security.authentication.digest_entry_point" class="%security.authentication.digest_entry_point.class%" public="false" />
 
         <service id="security.channel_listener" class="%security.channel_listener.class%" public="false">
             <argument type="service" id="security.access_map" />
@@ -115,9 +104,9 @@
         <service id="security.authentication.listener.x509" class="%security.authentication.listener.x509.class%" public="false" abstract="true">
             <argument type="service" id="security.context" />
             <argument type="service" id="security.authentication.manager" />
-            <argument />
-            <argument>%security.authentication.x509.user%</argument>
-            <argument>%security.authentication.x509.credentials%</argument>
+            <argument /> <!-- Provider-shared Key -->
+            <argument /> <!-- x509 user -->
+            <argument /> <!-- x509 credentials -->
             <argument type="service" id="logger" on-invalid="null" />
             <argument type="service" id="event_dispatcher" on-invalid="null"/>
         </service>
@@ -125,31 +114,31 @@
         <service id="security.authentication.listener.basic" class="%security.authentication.listener.basic.class%" public="false" abstract="true">
             <argument type="service" id="security.context" />
             <argument type="service" id="security.authentication.manager" />
-            <argument></argument>
-            <argument type="service" id="security.authentication.basic_entry_point" />
+            <argument /> <!-- Provider-shared Key -->
+            <argument /> <!-- Entry Point -->
             <argument type="service" id="logger" on-invalid="null" />
         </service>
 
         <service id="security.authentication.listener.digest" class="%security.authentication.listener.digest.class%" public="false" abstract="true">
             <argument type="service" id="security.context" />
-            <argument type="service" id="security.user.provider.in_memory" />
-            <argument></argument>
-            <argument type="service" id="security.authentication.digest_entry_point" />
+            <argument /> <!-- User Provider -->
+            <argument /> <!-- Provider-shared Key -->
+            <argument /> <!-- Entry Point -->
             <argument type="service" id="logger" on-invalid="null" />
         </service>
-        
+
         <service id="security.authentication.provider.dao" class="%security.authentication.provider.dao.class%" abstract="true" public="false">
             <argument /> <!-- User Provider -->
             <argument type="service" id="security.user_checker" />
             <argument /> <!-- Provider-shared Key -->
             <argument type="service" id="security.encoder_factory" />
         </service>
-        
+
         <service id="security.authentication.provider.pre_authenticated" class="%security.authentication.provider.pre_authenticated.class%" abstract="true" public="false">
             <argument /> <!-- User Provider -->
             <argument type="service" id="security.user_checker" />
         </service>
-        
+
         <service id="security.exception_listener" class="%security.exception_listener.class%" public="false" abstract="true">
             <argument type="service" id="security.context" />
             <argument type="service" id="security.authentication.trust_resolver" />
@@ -179,4 +168,4 @@
             <argument type="service" id="logger" on-invalid="null" />
         </service>
     </services>
-</container>
+</container>

文件差异内容过多而无法显示
+ 28 - 14
src/Symfony/Bundle/SecurityBundle/Resources/views/Collector/security.html.twig


+ 1 - 1
src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/SecurityExtensionTest.php

@@ -83,7 +83,7 @@ abstract class SecurityExtensionTest extends \PHPUnit_Framework_TestCase
                 'security.authentication.listener.form.secure',
                 'security.authentication.listener.basic.secure',
                 'security.authentication.listener.digest.secure',
-                'security.authentication.listener.anonymous',
+                'security.authentication.listener.anonymous.secure',
                 'security.access_listener',
                 'security.authentication.switchuser_listener.secure',
             ),

+ 0 - 2
src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/WebProfilerExtension.php

@@ -15,8 +15,6 @@ use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
 use Symfony\Component\Config\Resource\FileResource;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Reference;
-use Symfony\Component\DependencyInjection\Definition;
 use Symfony\Component\Config\FileLocator;
 
 /**

+ 1 - 1
src/Symfony/Component/Config/Definition/VariableNode.php

@@ -49,7 +49,7 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface
      */
     public function getDefaultValue()
     {
-        return $this->defaultValue;
+        return $this->defaultValue instanceof \Closure ? call_user_func($this->defaultValue) : $this->defaultValue;
     }
 
     /**

+ 1 - 0
src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php

@@ -118,6 +118,7 @@ EOF;
         foreach ($this->container->getInterfaceInjectors() as $injector) {
             $code .= sprintf("        if (\$instance instanceof \\%s) {\n", $injector->getClass());
             foreach ($injector->getMethodCalls() as $call) {
+                $arguments = array();
                 foreach ($call[1] as $value) {
                     $arguments[] = $this->dumpValue($value);
                 }

+ 8 - 1
src/Symfony/Component/HttpFoundation/ApacheRequest.php

@@ -31,7 +31,14 @@ class ApacheRequest extends Request
      */
     protected function prepareBaseUrl()
     {
-        return $this->server->get('SCRIPT_NAME');
+        $baseUrl = $this->server->get('SCRIPT_NAME');
+
+        if (false === strpos($this->server->get('REQUEST_URI'), $baseUrl)) {
+            // assume mod_rewrite
+            return rtrim(dirname($baseUrl), '/');
+        }
+
+        return $baseUrl;
     }
 
     /**

+ 39 - 0
tests/Symfony/Tests/Component/HttpFoundation/ApacheRequestTest.php

@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Tests\Component\HttpFoundation;
+
+use Symfony\Component\HttpFoundation\ApacheRequest;
+
+class ApacheRequestTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetBaseUrlDoesNotForceScriptName()
+    {
+        $request = new ApacheRequest();
+        $request->server->replace(array(
+            'REQUEST_URI' => '/foo/bar',
+            'SCRIPT_NAME' => '/index.php',
+        ));
+
+        $this->assertEquals('', $request->getBaseUrl(), '->getBaseUrl() does not add the script name');
+    }
+
+    public function testGetBaseUrlIncludesScriptName()
+    {
+        $request = new ApacheRequest();
+        $request->server->replace(array(
+            'REQUEST_URI' => '/index.php/foo/bar',
+            'SCRIPT_NAME' => '/index.php',
+        ));
+
+        $this->assertEquals('/index.php', $request->getBaseUrl(), '->getBaseUrl() includes the script name');
+    }
+}