Skip to content

Commit

Permalink
Merge branch '2.4'
Browse files Browse the repository at this point in the history
  • Loading branch information
weaverryan committed Mar 18, 2014
2 parents 27b3410 + de03953 commit 5fb6d21
Show file tree
Hide file tree
Showing 13 changed files with 193 additions and 8 deletions.
5 changes: 5 additions & 0 deletions cookbook/bundles/extension.rst
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,11 @@ The second method has several specific advantages:
supported configuration settings for which backward compatibility will
be maintained.

.. seealso::

For parameter handling within a Dependency Injection class see
:doc:`</cookbook/configuration/using_parameters_in_dic>`.

.. index::
single: Bundle; Extension
single: DependencyInjection; Extension
Expand Down
2 changes: 1 addition & 1 deletion cookbook/configuration/apache_router.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.. index::
single: Apache Router
single: Apache Router

How to use the Apache Router
============================
Expand Down
2 changes: 1 addition & 1 deletion cookbook/configuration/environments.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.. index::
single: Environments
single: Environments

How to Master and Create new Environments
=========================================
Expand Down
2 changes: 1 addition & 1 deletion cookbook/configuration/external_parameters.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.. index::
single: Environments; External parameters
single: Environments; External parameters

How to Set External Parameters in the Service Container
=======================================================
Expand Down
4 changes: 2 additions & 2 deletions cookbook/configuration/front_controllers_and_kernel.rst
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 the front controller, ``AppKernel`` and environments
work together

Understanding how the Front Controller, Kernel and Environments work together
=============================================================================
Expand Down
1 change: 1 addition & 0 deletions cookbook/configuration/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Configuration

environments
override_dir_structure
using_parameters_in_dic
front_controllers_and_kernel
external_parameters
pdo_session_storage
Expand Down
2 changes: 1 addition & 1 deletion cookbook/configuration/override_dir_structure.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.. index::
single: Override Symfony
single: Override Symfony

How to override Symfony's Default Directory Structure
=====================================================
Expand Down
2 changes: 1 addition & 1 deletion cookbook/configuration/pdo_session_storage.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.. index::
single: Session; Database Storage
single: Session; Database Storage

How to use PdoSessionHandler to store Sessions in the Database
==============================================================
Expand Down
159 changes: 159 additions & 0 deletions cookbook/configuration/using_parameters_in_dic.rst
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
----------------------------------------------------

You have seen how to use configuration parameters within
:ref:`Symfony service containers <book-service-container-parameters>`.
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"
xmlns:my-bundle="http://example.org/schema/dic/my_bundle">
<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 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
``%kernel.debug%`` but rather the new ``%assetic.debug%`` parameter.
2 changes: 1 addition & 1 deletion cookbook/configuration/web_server_configuration.rst
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
========================
Expand Down
1 change: 1 addition & 0 deletions cookbook/map.rst.inc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

* :doc:`/cookbook/configuration/environments`
* :doc:`/cookbook/configuration/override_dir_structure`
* :doc:`/cookbook/configuration/using_parameters_in_dic`
* :doc:`/cookbook/configuration/front_controllers_and_kernel`
* :doc:`/cookbook/configuration/external_parameters`
* :doc:`/cookbook/configuration/pdo_session_storage`
Expand Down
5 changes: 5 additions & 0 deletions cookbook/routing/service_container_parameters.rst
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,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 parameter handling within a Dependency Injection class see
:doc:`</cookbook/configuration/using_parameters_in_dic>`.
14 changes: 14 additions & 0 deletions reference/forms/types/entity.rst
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,20 @@ This is the property that should be used for displaying the entities
as text in the HTML element. If left blank, the entity object will be
cast into a string and so must have a ``__toString()`` method.

.. note::

The ``property`` option is the property path used to display the option. So you
can use anything supported by the
:doc:`PropertyAccessor component </components/property_access/introduction>`

For example, if the translations property is actually an associative array of
objects, each with a name property, then you could do this::

$builder->add('gender', 'entity', array(
'class' => 'MyBundle:Gender',
'property' => 'translations[en].name',
));

group_by
~~~~~~~~

Expand Down

0 comments on commit 5fb6d21

Please sign in to comment.