-
Notifications
You must be signed in to change notification settings - Fork 37
XmlConfiguration
Define container imports, parameters, and services using XML files.
XML is a supported configuration format alongside YAML, JSON and JS. Use XmlFileLoader to load .xml service configuration files.
import { ContainerBuilder, XmlFileLoader } from 'node-dependency-injection'
const container = new ContainerBuilder()
const loader = new XmlFileLoader(container)
await loader.load('/path/to/services.xml')Every XML configuration file must have a root <container> element. Inside it you can declare three optional sections: <imports>, <parameters> and <services>.
<?xml version="1.0" encoding="UTF-8"?>
<container>
<imports>...</imports>
<parameters>...</parameters>
<services>...</services>
</container>Use <import resource="..."/> to split your configuration across multiple files.
<?xml version="1.0" encoding="UTF-8"?>
<container>
<imports>
<import resource="./services/mailer.xml"/>
<import resource="./services/newsletter.xml"/>
</imports>
</container><parameters>
<parameter key="mailer.transport">sendmail</parameter>
</parameters><parameters>
<parameter key="feature.enabled" type="boolean">true</parameter>
</parameters><parameters>
<parameter key="mailer.gateways" type="collection">
<parameter>mail1</parameter>
<parameter>mail2</parameter>
<parameter>mail3</parameter>
</parameter>
</parameters><parameters>
<parameter key="app.config" type="map">
<parameter key="foo">bar</parameter>
<parameter key="bar">foo</parameter>
</parameter>
</parameters><services>
<service id="mailer" class="./Mailer">
<argument>sendmail</argument>
</service>
</services>Arguments follow the same conventions as all other loaders:
| Syntax | Result |
|---|---|
@serviceId |
Reference to another service |
@?serviceId |
Optional (nullable) reference |
%paramName% |
Parameter value |
%env(VAR_NAME)% |
Environment variable |
%packageName |
Node.js package (e.g. %fs) |
true / false with type="boolean"
|
Boolean value |
!tagged tagName with type="tagged"
|
All services tagged with that tag |
<service id="newsletter_manager" class="./NewsletterManager">
<argument>@mailer</argument>
<argument>%mailer.transport%</argument>
<argument>%env(SMTP_HOST)%</argument>
<argument>%fs</argument>
<argument type="boolean">true</argument>
<argument>@?optional_service</argument>
</service><service id="newsletter_manager" class="./NewsletterManager">
<call method="setMailer">
<argument>@mailer</argument>
</call>
<call method="setLogger">
<argument>@logger</argument>
</call>
</service><service id="newsletter_manager" class="./NewsletterManager">
<property name="transport">%mailer.transport%</property>
</service><service id="app.listener" class="./Listener">
<tag name="kernel.event_listener"/>
</service>Tags with attributes:
<service id="app.listener" class="./Listener">
<tag name="kernel.event_listener" event="postUpdate" method="onPostUpdate"/>
</service><service id="newsletter" alias="newsletter_manager"/>Using a class method:
<service id="mailer">
<factory class="./MailerFactory" method="create"/>
</service>Using a service reference:
<service id="mailer">
<factory service="@mailer_factory" method="create"/>
</service>When the class file exports multiple classes, use the main attribute to specify which one to use:
<service id="classOne" class="./MultipleExports" main="ClassOne"/>Same for factory:
<service id="foo">
<factory class="./MyFactory" main="MyFactoryClass" method="create"/>
</service><service id="heavy_service" class="./HeavyService" lazy="true"/><service id="internal_service" class="./InternalService" public="false"/><service id="form" class="./Form" shared="false"/><service id="request" synthetic="true"/><service id="old_mailer" class="./OldMailer" deprecated="Use mailer instead"/><service id="app.base_handler" class="./BaseHandler" abstract="true">
<argument>@logger</argument>
</service>
<service id="app.user_handler" class="./UserHandler" parent="app.base_handler"/><service id="app.decorating_mailer" class="./DecoratingMailer"
decorates="app.mailer" decoration-priority="1">
<argument>@app.decorating_mailer.inner</argument>
</service><service id="handler_manager" class="./HandlerManager">
<argument type="tagged">handler</argument>
</service><services>
<defaults autowire="true" dir="./src"/>
<service id="App\Mailer" class="./src/Mailer"/>
</services>An XSD schema is provided at node_modules/node-dependency-injection/lib/schema/services.xsd. You can reference it in your editor for autocompletion and validation:
<?xml version="1.0" encoding="UTF-8"?>
<container xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="./node_modules/node-dependency-injection/lib/schema/services.xsd">
...
</container>Copyright © 2023-2024 Mauro Gadaleta