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
5.4= / 2014.11
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 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...).
Static container parameters follows the %<parameter_name>%=
code> syntax in Symfony.
Dynamic parameters have the following: $<parameter_name>[; &=
lt;namespace>[; <scope>]]$
, default namespace being e=
zsettings
,
and default scope being current siteaccess.
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 =
implementseZ\Bundle\EzPublishCoreBundle\DependencyInjection\Confi=
guration\SiteAccessAware\DynamicSettingParserInterface
.
A few limitations still remain:
config.yml
or ezpublish.yml
) =
as they are meant primarily for parameter injection in services.onKernelRequest
method (or equivalent).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.
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
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
parameters: acme_test.my_service.class: Acme\TestBundle\MyServiceClass services: acme_test.my_service: class: %acme_test.my_service.class% calls: - [setLanguages, ["$languages$"]]=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.
parameters: acme_test.my_service.class: Acme\TestBundle\MyServiceClass services: acme_test.my_service: class: %acme_test.my_service.class% arguments: ["$languages$"]=20
namespace Acme\TestBundle; class MyServiceClass { /** * Prioritized languages * * @var array */ private $languages; public function __construct( array $languages ) { $this->languages =3D $languages; } }=20
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.
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
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