Переглянути джерело

[FrameworkBundle] made the profiler easily configurable

Fabien Potencier 14 роки тому
батько
коміт
28d9b331bd

+ 5 - 1
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

@@ -76,7 +76,11 @@ class Configuration
         $rootNode
             ->arrayNode('profiler')
                 ->canBeUnset()
-                ->booleanNode('only_exceptions')->end()
+                ->booleanNode('only_exceptions')->defaultValue(false)->end()
+                ->scalarNode('dsn')->defaultValue('sqlite:%kernel.cache_dir%/profiler.db')->end()
+                ->scalarNode('username')->defaultValue('')->end()
+                ->scalarNode('password')->defaultValue('')->end()
+                ->scalarNode('lifetime')->defaultValue(86400)->end()
                 ->arrayNode('matcher')
                     ->canBeUnset()
                     ->performNoDeepMerging()

+ 21 - 3
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

@@ -194,9 +194,27 @@ class FrameworkExtension extends Extension
         $loader->load('profiling.xml');
         $loader->load('collectors.xml');
 
-        if (isset($config['only_exceptions'])) {
-            $container->setParameter('profiler_listener.only_exceptions', $config['only_exceptions']);
-        }
+        $container->getDefinition('profiler_listener')
+            ->setArgument(2, $config['only_exceptions'])
+        ;
+
+        // Choose storage class based on the DSN
+        $supported = array(
+            'sqlite' => 'Symfony\Component\HttpKernel\Profiler\SqliteProfilerStorage',
+            'mysql'  => 'Symfony\Component\HttpKernel\Profiler\MysqlProfilerStorage',
+        );
+        list($class, ) = explode(':', $config['dsn']);
+        if (!isset($supported[$class])) {
+            throw new \LogicException(sprintf('Driver "%s" is not supported for the profiler.', $class));
+        }
+
+        $container->getDefinition('profiler.storage')
+            ->setArgument(0, $config['dsn'])
+            ->setArgument(1, $config['username'])
+            ->setArgument(2, $config['password'])
+            ->setArgument(3, $config['lifetime'])
+            ->setClass($supported[$class])
+        ;
 
         if (isset($config['matcher'])) {
             if (isset($config['matcher']['service'])) {

+ 6 - 12
src/Symfony/Bundle/FrameworkBundle/Resources/config/profiling.xml

@@ -6,13 +6,7 @@
 
     <parameters>
         <parameter key="profiler.class">Symfony\Component\HttpKernel\Profiler\Profiler</parameter>
-        <parameter key="profiler.storage.class">Symfony\Component\HttpKernel\Profiler\SqliteProfilerStorage</parameter>
-        <parameter key="profiler.storage.dsn">sqlite:%kernel.cache_dir%/profiler.db</parameter>
-        <parameter key="profiler.storage.username"></parameter>
-        <parameter key="profiler.storage.password"></parameter>
-        <parameter key="profiler.storage.lifetime">86400</parameter>
         <parameter key="profiler_listener.class">Symfony\Bundle\FrameworkBundle\Profiler\ProfilerListener</parameter>
-        <parameter key="profiler_listener.only_exceptions">false</parameter>
     </parameters>
 
     <services>
@@ -21,11 +15,11 @@
             <argument type="service" id="logger" on-invalid="null" />
         </service>
 
-        <service id="profiler.storage" class="%profiler.storage.class%" public="false">
-            <argument>%profiler.storage.dsn%</argument>
-            <argument>%profiler.storage.username%</argument>
-            <argument>%profiler.storage.password%</argument>
-            <argument>%profiler.storage.lifetime%</argument>
+        <service id="profiler.storage" class="" public="false">
+            <argument /> <!-- DSN -->
+            <argument /> <!-- Username -->
+            <argument /> <!-- Password -->
+            <argument /> <!-- Lifetime -->
         </service>
 
         <service id="profiler_listener" class="%profiler_listener.class%">
@@ -33,7 +27,7 @@
             <tag name="kernel.listener" event="core.exception" method="handleException" />
             <argument type="service" id="service_container" />
             <argument type="service" id="profiler.request_matcher" on-invalid="null" />
-            <argument>%profiler_listener.only_exceptions%</argument>
+            <argument /> <!-- Only exceptions? -->
         </service>
     </services>
 </container>

+ 5 - 1
src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

@@ -53,7 +53,11 @@
             <xsd:element name="matcher" type="profiler_matcher" minOccurs="0" maxOccurs="1" />
         </xsd:all>
 
-        <xsd:attribute name="only-exceptions" type="xsd:boolean" />
+        <xsd:attribute name="only-exceptions" type="xsd:string" />
+        <xsd:attribute name="dsn" type="xsd:string" />
+        <xsd:attribute name="username" type="xsd:string" />
+        <xsd:attribute name="password" type="xsd:string" />
+        <xsd:attribute name="lifetime" type="xsd:string" />
     </xsd:complexType>
 
     <xsd:complexType name="profiler_matcher">

+ 2 - 1
src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php

@@ -42,7 +42,8 @@ abstract class FrameworkExtensionTest extends TestCase
 
         $this->assertTrue($container->hasDefinition('profiler'), '->registerProfilerConfiguration() loads profiling.xml');
         $this->assertTrue($container->hasDefinition('data_collector.config'), '->registerProfilerConfiguration() loads collectors.xml');
-        $this->assertTrue($container->getParameter('profiler_listener.only_exceptions'));
+        $arguments = $container->getDefinition('profiler_listener')->getArguments();
+        $this->assertTrue($arguments[2]);
     }
 
     public function testRouter()