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:

SyntaxResult
@serviceIdReference to another service
@?serviceIdOptional (nullable) reference
%paramName%Parameter value
%env(VAR_NAME)%Environment variable
%packageNameNode.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>