-
-
Notifications
You must be signed in to change notification settings - Fork 5.2k
[Cookbook][Configuration] add configuration cookbook handlig parameters in Configurator class #3420
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 5 commits
243c0d1
ec13feb
c07c655
28c144a
a6bda5e
ad27a83
9710bb5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
.. index:: | ||
single: How front controller, ``AppKernel`` and environments | ||
work together | ||
single: How front controller, ``AppKernel`` and environments | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How the front controller [...] |
||
work together | ||
|
||
Understanding how the Front Controller, Kernel and Environments work together | ||
============================================================================= | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,159 @@ | ||
.. index:: | ||
single: Using Parameters Within A Dependency Injection Class | ||
|
||
Using Parameters Within A Dependency Injection Class | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think |
||
---------------------------------------------------- | ||
|
||
You have seen how to use configuration parameters within | ||
:ref:`Symfony service container <book-service-container-parameters>`. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Symfony service containers (plural) |
||
There are special cases such as when you want, for instance, to use the | ||
``%kernel.debug%`` parameter to make the services in your bundle enter | ||
debug mode. For this case there is more work to do in order | ||
to make the system understand the parameter value. By default | ||
your parameter ``%kernel.debug%`` will be treated as a | ||
simple string. Consider this example with the AcmeDemoBundle:: | ||
|
||
// Inside Configuration class | ||
$rootNode | ||
->children() | ||
->booleanNode('logging')->defaultValue('%kernel.debug%')->end() | ||
// ... | ||
->end() | ||
; | ||
|
||
// Inside the Extension class | ||
$config = $this->processConfiguration($configuration, $configs); | ||
var_dump($config['logging']); | ||
|
||
Now, examine the results to see this closely: | ||
|
||
.. configuration-block:: | ||
|
||
.. code-block:: yaml | ||
|
||
my_bundle: | ||
logging: true | ||
# true, as expected | ||
|
||
my_bundle: | ||
logging: %kernel.debug% | ||
# true/false (depends on 2nd parameter of AppKernel), | ||
# as expected, because %kernel.debug% inside configuration | ||
# gets evaluated before being passed to the extension | ||
|
||
my_bundle: ~ | ||
# passes the string "%kernel.debug%". | ||
# Which is always considered as true. | ||
# The Configurator does not know anything about | ||
# "%kernel.debug%" being a parameter. | ||
|
||
.. code-block:: xml | ||
|
||
<?xml version="1.0" encoding="UTF-8" ?> | ||
<container xmlns="http://symfony.com/schema/dic/services" | ||
my-bundle="http://example.org/schema/dic/my_bundle"> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. xmlns:my-bundle="... xmlns stands for XML NameSpace, so you include the http://example.org/schema/dic/my_bundle namespace as my-bundle in this document. |
||
|
||
<my-bundle:config logging="true" /> | ||
<!-- true, as expected --> | ||
|
||
<my-bundle:config logging="%kernel.debug%" /> | ||
<!-- true/false (depends on 2nd parameter of AppKernel), | ||
as expected, because %kernel.debug% inside configuration | ||
gets evaluated before being passed to the extension --> | ||
|
||
<my-bundle:config /> | ||
<!-- passes the string "%kernel.debug%". | ||
Which is always considered as true. | ||
The Configurator does not know anything about | ||
"%kernel.debug%" being a parameter. --> | ||
</container> | ||
|
||
.. code-block:: php | ||
|
||
$container->loadFromExtension('my_bundle', array( | ||
'logging' => true, | ||
// true, as expected | ||
) | ||
); | ||
|
||
$container->loadFromExtension('my_bundle', array( | ||
'logging' => "%kernel.debug%", | ||
// true/false (depends on 2nd parameter of AppKernel), | ||
// as expected, because %kernel.debug% inside configuration | ||
// gets evaluated before being passed to the extension | ||
) | ||
); | ||
|
||
$container->loadFromExtension('my_bundle'); | ||
// passes the string "%kernel.debug%". | ||
// Which is always considered as true. | ||
// The Configurator does not know anything about | ||
// "%kernel.debug%" being a parameter. | ||
|
||
In order to support this use case, the ``Configuration`` class has to | ||
be injected with this parameter via the extension as follows:: | ||
|
||
namespace Acme\DemoBundle\DependencyInjection; | ||
|
||
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; | ||
use Symfony\Component\Config\Definition\Builder\TreeBuilder; | ||
use Symfony\Component\Config\Definition\ConfigurationInterface; | ||
|
||
class Configuration implements ConfigurationInterface | ||
{ | ||
private $debug; | ||
|
||
public function __construct($debug) | ||
{ | ||
$this->debug = (Boolean) $debug; | ||
} | ||
|
||
public function getConfigTreeBuilder() | ||
{ | ||
$treeBuilder = new TreeBuilder(); | ||
$rootNode = $treeBuilder->root('acme_demo'); | ||
|
||
$rootNode | ||
->children() | ||
// ... | ||
->booleanNode('logging')->defaultValue($this->debug)->end() | ||
// ... | ||
->end() | ||
; | ||
|
||
return $treeBuilder; | ||
} | ||
} | ||
|
||
And set it in the constructor of ``Configuration`` via the ``Extension`` class:: | ||
|
||
namespace Acme\DemoBundle\DependencyInjection; | ||
|
||
use Symfony\Component\DependencyInjection\ContainerBuilder; | ||
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; | ||
use Symfony\Component\HttpKernel\DependencyInjection\Extension; | ||
use Symfony\Component\Config\FileLocator; | ||
|
||
class AcmeDemoExtension extends Extension | ||
{ | ||
// ... | ||
|
||
public function getConfiguration(array $config, ContainerBuilder $container) | ||
{ | ||
return new Configuration($container->getParameter('kernel.debug')); | ||
} | ||
} | ||
|
||
.. sidebar:: Setting the Default in the Extension | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You have to indent the following lines by four spaces to make them part of the sidebar. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
|
||
There are some instances of ``%kernel.debug%`` usage within a ``Configurator`` | ||
class in TwigBundle and AsseticBundle, however this is because the default | ||
parameter value is set by the Extension class. For example in AsseticBundle, | ||
you can find:: | ||
|
||
$container->setParameter('assetic.debug', $config['debug']); | ||
|
||
The string ``%kernel.debug%`` passed here as an argument handles the | ||
interpreting job to the container which in turn does the evaluation. | ||
Both ways accomplish similar goals. AsseticBundle will not use | ||
anymore ``%kernel.debug%`` but rather the new ``%assetic.debug%`` parameter. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
.. index:: | ||
single: Web Server | ||
single: Web Server | ||
|
||
Configuring a web server | ||
======================== | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -120,3 +120,8 @@ path): | |
However, as the ``%`` characters included in any URL are automatically encoded, | ||
the resulting URL of this example would be ``/score-50%25`` (``%25`` is the | ||
result of encoding the ``%`` character). | ||
|
||
.. seealso:: | ||
|
||
For other usages of the parameter ``%`` syntax see | ||
:doc:`Using Parameters Within A Dependency Injection Class </cookbook/using_parameters_in_dic>`. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You don't have to use the title here: :doc:`</cookbook/using_parameters_in_dic>`. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Additionally, the document is located at ``/cookbook/configuration/using_parameters_in_dic`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You don't have to use the title here:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Additionally, the document is located at ``/cookbook/configuration/using_parameters_in_dic`.