Message-ID: <145738601.3328.1485852734046.JavaMail.confluence@ip-10-127-227-164> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_3327_1636223521.1485852734046" ------=_Part_3327_1636223521.1485852734046 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html Dynamic settings injection

Dynamic settings injection

5.4=  / 2014.11

=20 =20

Description

Before 5.4, if one wanted to implement a service needing siteaccess-awar= e settings (e.g. language settings),
they needed to inject the whole ConfigResolver (ezpublish.config.resolver) and get = the needed settings from it.

This was not very convenient nor explicit.
Goal of this feature is t= o allow developers to inject these dynamic settings explicitly from their s= ervice definition (yml, xml, annotation...).

Usage

Syntax

Static container parameters follows the %<parameter_name>% syntax in Symfony.

Dynamic parameters have the following: $<parameter_name>[; &= lt;namespace>[; <scope>]]$, default namespace being e= zsettings,
and default scope being current siteaccess.

For more information, see=20 ConfigResolver documentation.

DynamicSettingPars= er

This feature also introduces a DynamicSettingParser service tha= t can be used for adding support of the dynamic settings syntax.
This s= ervice has ezpublish.config.dynamic_setting.parser for ID and = implements
eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Confi= guration\SiteAccessAware\DynamicSettingParserInterface.

Limitations

A few limitations still remain:

Examples

Injecting an eZ = parameter

Defining a simple service needing languages parameter (i.e.= prioritized languages).

Note

Internally, languages parameter is defined as ezsetti= ngs.<siteaccess_name>.languages, ezsettings being= eZ internal namespace.

Before 5.4
=20
parameters:
    acme_test.my_service.class: Acme\TestBundle\MyServiceClass

services:
    acme_test.my_service:
        class: %acme_test.my_service.class%
        arguments: [@ezpublish.config.resolver]

namespace Acme\TestBundle;
=20


=20
use eZ\Publish\Core\MVC\ConfigResolverInterface;

class MyServiceClass
{
    /**
 * Prioritized languages
 *
 * @var array
 */
    private $languages;

    public function __construct( ConfigResolverInterface $configResolver )
    {
        $this->languages =3D $configResolver->getParameter( 'language=
s' );
    }
}
=20

After, with setter injection (preferred)

=20
parameters:
    acme_test.my_service.class: Acme\TestBundle\MyServiceClass

services:
    acme_test.my_service:
        class: %acme_test.my_service.class%
        calls:
            - [setLanguages, ["$languages$"]]
=20
=20
namespace Acme\TestBundle;

class MyServiceClass
{
    /**
 * Prioritized languages
 *
 * @var array
 */
    private $languages;

    public function setLanguages( array $languages =3D null )
    {
        $this->languages =3D $languages;
    }
}
=20

 

 

Important: Ensure you always add null as a= default value, especially if the argument is type-hinted.

After= , with constructor injection

=20
parameters:
    acme_test.my_service.class: Acme\TestBundle\MyServiceClass

services:
    acme_test.my_service:
        class: %acme_test.my_service.class%
        arguments: ["$languages$"]
=20

 

 

=20
namespace Acme\TestBundle;

class MyServiceClass
{
    /**
 * Prioritized languages
 *
 * @var array
 */
    private $languages;

    public function __construct( array $languages )
    {
        $this->languages =3D $languages;
    }
}
=20

 

 

Tip

Setter injection for dynamic settings should always be preferred, as it = makes it possible to update your services that depend on them when ConfigRe= solver is updating its scope (e.g. when previewing content in a given SiteA= ccess). However, only one dynamic setting should be injected by set= ter.

Constructor injection will make your service be reset in that ca= se.

Injecting 3rd party parameters

 

=20
parameters:
    acme_test.my_service.class: Acme\TestBundle\MyServiceClass
    # "acme" is our parameter namespace.
    # Null is the default value.
    acme.default.some_parameter: ~
    acme.ezdemo_site.some_parameter: foo
    acme.ezdemo_site_admin.some_parameter: bar
 
services:
    acme_test.my_service:
        class: %acme_test.my_service.class%
        # The following argument will automatically resolve to the right va=
lue, depending on the current SiteAccess.
        # We specify "acme" as the namespace we want to use for parameter r=
esolving.
        calls:
            - [setSomeParameter, ["$some_parameter;acme$"]]
=20
=20
namespace Acme\TestBundle;
class MyServiceClass
{
    private $myParameter;
    public function setSomeParameter( $myParameter =3D null )
    {
        // Will be "foo" for ezdemo_site, "bar" for ezdemo_site_admin, or n=
ull if another SiteAccess.
        $this->myParameter =3D $myParameter;
    }
}
=20

 

 
------=_Part_3327_1636223521.1485852734046--