Documentation
XML Configuration
XML Configuration
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')
File structure
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>
Imports
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
Scalar parameter
<parameters>
<parameter key="mailer.transport">sendmail</parameter>
</parameters>
Boolean parameter
<parameters>
<parameter key="feature.enabled" type="boolean">true</parameter>
</parameters>
Array (collection) parameter
<parameters>
<parameter key="mailer.gateways" type="collection">
<parameter>mail1</parameter>
<parameter>mail2</parameter>
<parameter>mail3</parameter>
</parameter>
</parameters>
Object (map) parameter
<parameters>
<parameter key="app.config" type="map">
<parameter key="foo">bar</parameter>
<parameter key="bar">foo</parameter>
</parameter>
</parameters>
Services
Basic service
<services>
<service id="mailer" class="./Mailer">
<argument>sendmail</argument>
</service>
</services>
Arguments
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>
Method calls
<service id="newsletter_manager" class="./NewsletterManager">
<call method="setMailer">
<argument>@mailer</argument>
</call>
<call method="setLogger">
<argument>@logger</argument>
</call>
</service>
Properties
<service id="newsletter_manager" class="./NewsletterManager">
<property name="transport">%mailer.transport%</property>
</service>
Tags
<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>
Alias
<service id="newsletter" alias="newsletter_manager"/>
Factory
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>
Named / multiple exports
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>
Lazy service
<service id="heavy_service" class="./HeavyService" lazy="true"/>
Private service
<service id="internal_service" class="./InternalService" public="false"/>
Non-shared (prototype) service
<service id="form" class="./Form" shared="false"/>
Synthetic service
<service id="request" synthetic="true"/>
Deprecated service
<service id="old_mailer" class="./OldMailer" deprecated="Use mailer instead"/>
Abstract and parent services
<service id="app.base_handler" class="./BaseHandler" abstract="true">
<argument>@logger</argument>
</service>
<service id="app.user_handler" class="./UserHandler" parent="app.base_handler"/>
Decorated service
<service id="app.decorating_mailer" class="./DecoratingMailer"
decorates="app.mailer" decoration-priority="1">
<argument>@app.decorating_mailer.inner</argument>
</service>
Tagged arguments
<service id="handler_manager" class="./HandlerManager">
<argument type="tagged">handler</argument>
</service>
Autowire defaults
<services>
<defaults autowire="true" dir="./src"/>
<service id="App\Mailer" class="./src/Mailer"/>
</services>
XML Schema
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>
