Теги внедрения зависимостей

Теги внедрения зависимостей

Теги внедрения зависимостей - это маленькие строки, которые могут быть применены к сервису для "помечания" его использования особым образом. Например, если у вас есть сервис, который вы хотите зарегистрировать в качестве слушателя одного из базовых событий Symfony, то вы можете пометить его тегом kernel.event_listener.

Вы можете узнать немного больше о "тегах", прочитав статью "How to Work with Service Tags".

Ниже находится информацию обо всех доступных внутри Symfony тегах. В других пакетах также могут быть теги, которые вы используете, но которые не указаны.

Имя тега Использование
assetic.asset Зарегистрировать ресурс в текущем менеджере ресурсов
assetic.factory_worker Добавить работника фабрики
assetic.filter Зарегистрировать фильтр
assetic.formula_loader Добавить загрузчик формулы в текущий ресурс
assetic.formula_resource Добавить источник в текущий менеджер ресурсов
assetic.templating.php Удалить этот сервис, если отключен шаблонизатор PHP
assetic.templating.twig Удалить этот сервис, если отключен шаблонизатор Twig
auto_alias Определить союзников, основываясь на значении параметров контейнера
console.command Добавить команду
controller.argument_value_resolver Зарегистрировать разрешитель значений для аргументов контроллера вроде Request
data_collector Создать класс, собирающий пользовательские данные для профилировщика
doctrine.event_listener Добавить слушателя событий Doctrine
doctrine.event_subscriber Добавить подписчика событий Doctrine
form.type Создать пользовательский тип поля формы
form.type_extension Создать пользовательское "расширение формы"
form.type_guesser Добавить вашу собственную логику для "отгадывания типа формы"
kernel.cache_clearer Зарегистрировать ваш сервис для вызова во время процесса очистки кеша
kernel.cache_warmer Зарегистрировать ваш сервис для вызова во время процесса разогрева кеша
kernel.event_listener Слушать разные события/привязки в Symfony
kernel.event_subscriber Подписаться на набор разных событий/привязок в Symfony
kernel.fragment_renderer Доавить новые стратегии отображение HTTP-содержимого
monolog.logger Логировать пользовательским каналом логирования
monolog.processor Добавить пользовательский процессор для логирования
routing.loader Зарегистрировать пользовательский сервис, загружающий маршруты
routing.expression_language_provider Зарегистрировать провайдер для функций языка выражений в маршрутизации
security.expression_language_provider Зарегистрировать провайдер для функций языка выражений в безопасности
security.voter Добавить пользовательского избирателя в логику авторизации Symfony
security.remember_me_aware Разрешить аутентификацию "запомнить меня"
serializer.encoder Зарегистрировать новый кодировщик в сервисе serializer
serializer.normalizer Зарегистрировать новый нормализатор в сервисе serializer
swiftmailer.default.plugin Зарегистрировать пользовательский плагин SwiftMailer
templating.helper Сделать ваш сервис доступным в PHP-шаблонах
translation.loader Зарегистрировать пользовательский сервис, загружающий переводы
translation.extractor Зарегистрировать пользовательский сервис, извлекающий сообщения перевода из файла
translation.dumper Зарегистрировать пользоветельский сервис, сбрасывающий сообщения перевода
twig.extension Зарегистрировать пользовательское расширение Twig
twig.loader Зарегистрировать пользовательский сервис, загружающий шаблоны Twig
validator.constraint_validator Создать собственное пользовательское ограничение валидации
validator.initializer Зарегистрировать сервис, инициализирующий объекты до валидации

assetic.asset

Цель: Зарегистрировать ресурс в текущем менеджере ресурсов

assetic.factory_worker

Цель: Добавить работника фабрики

Работник фабрики - это класс, реализующий Assetic\Factory\Worker\WorkerInterface. Его метод process($asset) вызывается для каждого ресурса после создания ресурса. Вы можете изменить ресурс или даже вернуть новый.

Для того, чтобы добавить нового работника, для начала создайте класс:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
use Assetic\Asset\AssetInterface;
use Assetic\Factory\Worker\WorkerInterface;

class MyWorker implements WorkerInterface
{
    public function process(AssetInterface $asset)
    {
        // ... измените $asset, или верните новый
    }

}

А потом зарегистрируйте его, как тегированный сервис:

  • YAML
    1
    2
    3
    services:
        AppBundle\Assetic\CustomWorker:
            tags: [assetic.factory_worker]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="AppBundle\Assetic\CustomWorker">
                <tag name="assetic.factory_worker" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use AppBundle\Assetic\CustomWorker;
    
    $container
        ->register(CustomWorker::class)
        ->addTag('assetic.factory_worker')
    ;
    

assetic.filter

Цель: Зарегистрировать фильтр

AsseticBundle использует этот тег, чтобы зарегистрировать общие фильтры. Вы также можете использовать этот тег, чтоб регистрировать ваши собственные фильтры.

Для начала, вам нужно создать фильтр:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
use Assetic\Asset\AssetInterface;
use Assetic\Filter\FilterInterface;

class MyFilter implements FilterInterface
{
    public function filterLoad(AssetInterface $asset)
    {
        $asset->setContent('alert("yo");' . $asset->getContent());
    }

    public function filterDump(AssetInterface $asset)
    {
        // ...
    }
}

Далее, определите сервис:

  • YAML
    1
    2
    3
    4
    services:
        AppBundle\Assetic\CustomFilter:
            tags:
                - { name: assetic.filter, alias: my_filter }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="AppBundle\Assetic\CustomFilter">
                <tag name="assetic.filter" alias="my_filter" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use AppBundle\Assetic\CustomFilter;
    
    $container
        ->register(CustomFilter::class)
        ->addTag('assetic.filter', array('alias' => 'my_filter'))
    ;
    

Наконец, примените фильтр:

1
2
3
4
5
6
{% javascripts
    '@AcmeBaseBundle/Resources/public/js/global.js'
    filter='my_filter'
%}
    <script src="{{ asset_url }}"></script>
{% endjavascripts %}

Вы также можете применить ваш фильтр через опцию конфигурации assetic.filters.my_filter.apply_to так, как это описано здесь: How to Apply an Assetic Filter to a specific File Extension. Для того, чтобы сделать это, вам нужно определить ваш сервис фильтра в отдельном файле конфигурации xml и указать путь этого маршрута через ключ конфигурации assetic.filters.my_filter.resource.

assetic.formula_loader

Цель: Добавить загрузчик формулы в текущий ресурс

Загрузчик формулы - это класс, реализующий интерфейс Assetic\\Factory\Loader\\FormulaLoaderInterface. Этот класс отвечает за загрузку ресурсов из оопределённого типа источников (например, шаблонов twig). Assetic поставляет загрузчиков для шаблонов PHP и Twig.

Атрибут alias определяет имя загрузчика.

assetic.formula_resource

Цель: Добавить источник в текущий менеджер ресурсов

Источник - это то, откуда можно загружать формулы. Например, шаблоны Twig - это источники.

assetic.templating.php

Цель: Удалить этот сервис, если отключен шаблонизатор PHP

Тегированный сервис будет удалён из контейнера, если раздел конфигурации framework.templating.engines не содержит php.

assetic.templating.twig

Purpose: Удалить этот сервис, если отключен шаблонизатор Twig

Тегированный сервис будет удалён из контейнера, если раздел конфигурации framework.templating.engines не содержит twig.

auto_alias

Цель: Определить союзников, основываясь на значении параметров контейнера

Рассмотрите следующую конфигурацию, определяющие три разных, но связанных сервиса:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    services:
        app.mysql_lock:
            class: AppBundle\Lock\MysqlLock
            public: false
        app.postgresql_lock:
            class: AppBundle\Lock\PostgresqlLock
            public: false
        app.sqlite_lock:
            class: AppBundle\Lock\SqliteLock
            public: false
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="app.mysql_lock" public="false"
                     class="AppBundle\Lock\MysqlLock" />
            <service id="app.postgresql_lock" public="false"
                     class="AppBundle\Lock\PostgresqlLock" />
            <service id="app.sqlite_lock" public="false"
                     class="AppBundle\Lock\SqliteLock" />
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    use AppBundle\Lock\MysqlLock;
    use AppBundle\Lock\PostgresqlLock;
    use AppBundle\Lock\SqliteLock;
    
    $container->register('app.mysql_lock', MysqlLock::class)->setPublic(false);
    $container->register('app.postgresql_lock', PostgresqlLock::class)->setPublic(false);
    $container->register('app.sqlite_lock', SqliteLock::class)->setPublic(false);
    

Вместо того, чтобы работать с этими сервисами, вашему приложению требуется общий сервис app.lock, который будет союзником одного из этих сервисов, в зависимости от некоторой конфигурации. Благодаря опции auto_alias, вы можете автоматически создать этого союзника, основываясь на значении параметра конфигурации.

Предположим, что параметр конфигурации, под названием database_type, существует. Тогда, общий сервис app.lock может быть определён следующим образом:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    services:
        app.mysql_lock:
            # ...
        app.postgresql_lock:
            # ...
        app.sqlite_lock:
            # ...
        app.lock:
            tags:
                - { name: auto_alias, format: "app.%database_type%_lock" }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="app.mysql_lock" public="false"
                     class="AppBundle\Lock\MysqlLock" />
            <service id="app.postgresql_lock" public="false"
                     class="AppBundle\Lock\PostgresqlLock" />
            <service id="app.sqlite_lock" public="false"
                     class="AppBundle\Lock\SqliteLock" />
    
            <service id="app.lock">
                <tag name="auto_alias" format="app.%database_type%_lock" />
            </service>
        </services>
    </container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    use AppBundle\Lock\MysqlLock;
    use AppBundle\Lock\PostgresqlLock;
    use AppBundle\Lock\SqliteLock;
    
    $container->register('app.mysql_lock', MysqlLock::class)->setPublic(false);
    $container->register('app.postgresql_lock', PostgresqlLock::class)->setPublic(false);
    $container->register('app.sqlite_lock', SqliteLock::class)->setPublic(false);
    
    $container->register('app.lock')
        ->addTag('auto_alias', array('format' => 'app.%database_type%_lock'));
    

Опция format определяет выражение, использованное для создания имени сервиса для союзника. Это выражение может использовать любой параметр контейнера (как обычно, заключая их имена в символы %).

Note

При использовании тега auto_alias,определять союзные сервисы приватными не обязательно. Однако, это в большинстве случаев имеет смысл сделать (как в примере выше), чтобы предотвратить полчение доступа к этим сервисам напрямую вместо использования общего союзника сервиса.

Note

Вам нужно вручную добавить пропуск компилировщика Symfony\Component\DependencyInjection\Compiler\AutoAliasServicePass к контейнеру для того, чтобы эта функция работала.

console.command

Цель: Добавить команду в приложение

Чтобы узнать детали о регистрации ваших собственных команд в сервис-контейнере, прочтите How to Define Commands as Services.

controller.argument_value_resolver

Цель: RЗарегистрировать разрешитель значений для аргументов контроллера вроде Request

Разрешители значений реализуют ArgumentValueResolverInterface и используются для разрешения значений аргументов для контроллеров, как описано тут: Extending Action Argument Resolving.

data_collector

Цель: Создать класс, собирающий пользовательские данные для профилировщика

Для того, чтобы узнать детали о создании вашей собственной пользовательской коллекции данных, прочтите статью How to Create a custom Data Collector.

doctrine.event_listener

Цель: Добавить слушателя событий Doctrine

Для того, чтобы узнать детали о создании слушателей событий Doctrine, прочтите статью How to Register Event Listeners and Subscribers.

doctrine.event_subscriber

Цель: Добавить подписчика событий Doctrine

Для того, чтобы узнать детали о создании подписчиков событий Doctrine, прочтите статью How to Register Event Listeners and Subscribers.

form.type

Цель: CСоздать пользовательский тип поля формы

Для того, чтобы узнать детали о создании вашего собственного пользовательского типа формы, прочтите статью How to Create a Custom Form Field Type.

form.type_extension

Цель: Создать пользовательское "расширение формы"

Для того, чтобы узнать детали о создании расширений типов формы, прочтите статью How to Create a Form Type Extension.

form.type_guesser

Цель: Добавить вашу собственную логику для "отгадывания типа формы"

Этот тег позволяет вам добавлять вашу собственную логику в процесс угадывания формы. По умолчанию, угадывание угадывание формы проводится "отгадывателями", основываясь на метаданных валидации и Doctrine (если вы используете Doctrine) или Propel (если вы используете Propel).

Чтобы узнать, как создать ваш собственный отгадыватель типов, см. Creating a custom Type Guesser.

kernel.cache_clearer

Цель: Зарегистрировать ваш сервис для вызова во время процесса очистки кеша

Очистка кеша происходит каждый раз, когда вы вызываете команду cache:clear. Если ваш пакет кеширует файлы, вам нужно добавить пользовательского очистителя кеша для очистки этих файлов во время процесса очистки кеша.

Для того, чтобы зарегистрировать вашего пользовательского очистителя кеша, для начала вам нужно создать класс сервиса:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// src/AppBundle/Cache/MyClearer.php
namespace AppBundle\Cache;

use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;

class MyClearer implements CacheClearerInterface
{
    public function clear($cacheDir)
    {
        // очистите ваш кеш
    }
}

Если вы используетет конфигурацию services.yml по умолчанию, то ваш сервис будет автоматически тегирован kernel.cache_clearer. Но, вы также можете зарегистрировать его вручную:

  • YAML
    1
    2
    3
    services:
        AppBundle\Cache\MyClearer:
            tags: [kernel.cache_clearer]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="AppBundle\Cache\MyClearer">
                <tag name="kernel.cache_clearer" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use AppBundle\Cache\MyClearer;
    
    $container
        ->register(MyClearer::class)
        ->addTag('kernel.cache_clearer')
    ;
    

kernel.cache_warmer

Цель: Зарегистрировать ваш сервис для вызова во время процесса разогрева кеша

Разогрев кеша происходит каждый раз, когда вы выполняете команду cache:warmup или cache:clear (разве только вы не передаёте --no-warmup в cache:clear). Он также выполняется при обработке запроса, если он ещё не был проведен одной из команд.

New in version 3.3: Начиная с Symfony 3.3, часть разогрева команды cache:clear осуждается. Вы всегда должны передавать опцию --no-warmup для cache:clear, и вместо этого использовать cache:warmup для разогрева кеша.

Целью является инициализация любого кеша, который будет необходим приложению, и предотвратить первого пользователя от существенной "нагрузки кеша". когда кеш генерируется динамически.

Зарегистрируйте ваш собственный разогреватель кеша, для начала создайте сервис, реализующий интерфейс CacheWarmerInterface:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// src/Acme/MainBundle/Cache/MyCustomWarmer.php
namespace AppBundle\Cache;

use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;

class MyCustomWarmer implements CacheWarmerInterface
{
    public function warmUp($cacheDir)
    {
        // ... сделайте какие-то оперции, чтобы "разогреть" ваш кеш
    }

    public function isOptional()
    {
        return true;
    }
}

Метод isOptional() должен возвращать true, если возможо использовать приложение не вызывая этого разогревателя кеша. В Symfony, необязательные разогреватели всегда выполняются по умолчанию (вы можете изменить это, используя опцию --no-optional-warmers при выполнении команды).

Если вы используете конфигурацию services.yml по умолчанию, то ваш сервис будет автоматически тегирован kernel.cache_warmer. Но вы также можете зарегистрировать его вручную:

  • YAML
    1
    2
    3
    4
    services:
        AppBundle\Cache\MyCustomWarmer:
            tags:
                - { name: kernel.cache_warmer, priority: 0 }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="AppBundle\Cache\MyCustomWarmer">
                <tag name="kernel.cache_warmer" priority="0" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use AppBundle\Cache\MyCustomWarmer;
    
    $container
        ->register(MyCustomWarmer::class)
        ->addTag('kernel.cache_warmer', array('priority' => 0))
    ;
    

Note

Значение priority необязательно, и по умолчанию равняется 0. Чем выше приоритет, тем скорее оно будет выполнено.

Caution

Если ваш разогреватель кеша не будет выполнен из-за исключения, то Symfony не будет пытаться выполнить его опять для следующих запросов. Следовательно, ваше приложение и/или пакеты должны быть готовы к тому, что содержимое, сгенерированное разогревателем кеша, может быть недоступно.

Базовые разогреватели кеша

Имя класса разогревателя кеша Приоритет
TemplatePathsCacheWarmer 20
RouterCacheWarmer 0
TemplateCacheCacheWarmer 0

kernel.event_listener

Цель: TСлушать разные события/привязки в Symfony

Во время выполнения приложения Symfony, вызываются разные события, и вы также можете диспетчеризировать пользовательские события. Этот тег позволяе вам привязать ваши собственные классы к любому из этих событий.

Для того, чтобы увидеть полный пример этого слушателя, прочтите статью Events and Event Listeners.

Справочник базовых слушателей событий

Чтобы увидеть справочник слушателей событий, связанных с каждым событием ядра, смотрите Справочник событий Symfony.

kernel.event_subscriber

Цель: Подписаться на набор разных событий/привязок в Symfony

Это альтернативный способ создать слушателя событий, и он является рекомендованным (вместо использования kernel.event_listener). См. Создание абонента событий.

kernel.fragment_renderer

Цель: Добавить новые стратегии отображение HTTP-содержимого

Для того, чтобы добавить новую стратегию отображения - в дополнение к базовым стратегиям вроде EsiFragmentRenderer - создайте класс, реализующий FragmentRendererInterface, зарегистрируйте его как сервис, а потом тегируйте его kernel.fragment_renderer.

monolog.logger

Цель: Логировать пользовательским каналом логирования c Monolog

Monolog позволяет вам делить обработчиковм между несколькими каналами логирования. Сервис логирования использует канал app, но вы можете изменить канал при внедрении логгера в сервис.

  • YAML
    1
    2
    3
    4
    5
    services:
        AppBundle\Log\CustomLogger:
            arguments: ['@logger']
            tags:
                - { name: monolog.logger, channel: acme }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="AppBundle\Log\CustomLogger">
                <argument type="service" id="logger" />
                <tag name="monolog.logger" channel="acme" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use AppBundle\Log\CustomLogger;
    use Symfony\Component\DependencyInjection\Reference;
    
    $container->register(CustomLogger::class)
        ->addArgument(new Reference('logger'))
        ->addTag('monolog.logger', array('channel' => 'acme'));
    

Tip

Вы также можете сконфигурировать пользовательские каналы в конфигурации и извлечь соответствующий сервис логирования напрямую из сервис-контейнера (см. Конфигурация дополнительных канало без тегированных сервисов).

monolog.processor

Цель: Добавить пользовательский процессор для логирования

Monolog позволяет вам добавлять процессы в логгер или в обработчики для добавления дополнительных данных в записи. Процессор получает запись в качестве аргумента и должен вернуть его после добавления некоторых дополнительных данных в атрибуте записи extra.

Встроенный IntrospectionProcessor может быть использован, чтобы добавить файл, строку, класс и метод, где был вызван логгер.

Вы можете добавить процессор глобально:

  • YAML
    1
    2
    3
    services:
        Monolog\Processor\IntrospectionProcessor:
            tags: [monolog.processor]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="Monolog\Processor\IntrospectionProcessor">
                <tag name="monolog.processor" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use Monolog\Processor\IntrospectionProcessor;
    
    $container
        ->register(IntrospectionProcessor::class)
        ->addTag('monolog.processor')
    ;
    

Tip

Если ваш сервис не является вызываемым (используя __invoke()), то вы можете добавить атрибут method в тег, чтобы использовать специальный метод.

Вы также можете добавить процессор для конкретного обработчика, используя атрибут handler:

  • YAML
    1
    2
    3
    4
    services:
        Monolog\Processor\IntrospectionProcessor:
            tags:
                - { name: monolog.processor, handler: firephp }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="Monolog\Processor\IntrospectionProcessor">
                <tag name="monolog.processor" handler="firephp" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use Monolog\Processor\IntrospectionProcessor;
    
    $container
        ->register(IntrospectionProcessor::class)
        ->addTag('monolog.processor', array('handler' => 'firephp'))
    ;
    

Вы также можете добавить процессор для конкретного канала логирования, используя атрибут channel. Он зарегистрирует процессор только для канала логирования security, используемого в компоненте Безопасность:

  • YAML
    1
    2
    3
    4
    services:
        Monolog\Processor\IntrospectionProcessor:
            tags:
                - { name: monolog.processor, channel: security }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="Monolog\Processor\IntrospectionProcessor">
                <tag name="monolog.processor" channel="security" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use Monolog\Processor\IntrospectionProcessor;
    
    $container
        ->register(IntrospectionProcessor::class)
        ->addTag('monolog.processor', array('channel' => 'security'))
    ;
    

Note

Вы не можете использовать оба атрибута handler и channel для одного тега, так как обработчики общие для всех каналов.

routing.loader

Цель: Зарегистрировать пользовательский сервис, загружающий маршруты

Чтобы подключить пользовательский загрузчик маршрутов, добавьте его в качестве регулярного сервиса к одной из ваших конфигураций, и тегируйте его routing.loader:

  • YAML
    1
    2
    3
    services:
        AppBundle\Routing\CustomLoader:
            tags: [routing.loader]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="AppBundle\Routing\CustomLoader">
                <tag name="routing.loader" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use AppBundle\Routing\CustomLoader;
    
    $container
        ->register(CustomLoader::class)
        ->addTag('routing.loader')
    ;
    

Чтобы узнать больше, см. How to Create a custom Route Loader.

routing.expression_language_provider

Цель: Зарегистрировать провайдер для функций языка выражений в маршрутизации

Этот тег используется для автоматической регистрации провайдеров функции выражений для компонента маршрутизации выражений. Используя эти провайдеры, вы можете добавлять пользовательские функции в язык маршрутизации выражений.

security.expression_language_provider

Цель: Зарегистрировать провайдер для функций языка выражений в безопасности

Этот тег используется для автоматической регистрации провайдеров функции выражений для компонента безопасности выражений. Используя эти провайдеры, вы можете добавлять пользовательские функции в язык безопасности выражений.

security.remember_me_aware

Цель: Разрешить аутентификацию "запомнить меня"

Этот тег используется внутренне, чтобы разрешить работу аутентификации "запомнить меня". Если у вас есть пользовательский метод аутентификации, где пользователь может пройти аутентификацию "запомнить меня", то вам может понадобится использовать этот тег.

Если ваша пользовательская фабрика аутентификации расширяет AbstractFactory, а ваш пользовательский слушатель аутентификации расширяет AbstractAuthenticationListener, то ваш пользовательский слушатель аутентификации автоматически применит этот тег и будет функционировать автоматически.

security.voter

Цель: Добавить пользовательского избирателя в логику авторизации Symfony

Когда вы вызываете isGranted() в контролёре авторизации Symfony, за кулисами используется система "избирателей", чтобы определить, есть ли у пользователя доступ. Тег security.voter позволяет вам добавлять вашего пользователького избирателя в эту систему.

Чтобы узнать больше, прочтите статью How to Use Voters to Check User Permissions.

serializer.encoder

Цель: Зарегистрировать новый кодировщик в сервисе serializer

Тегированный класс должен реализовать EncoderInterface и DecoderInterface.

Чтобы узнать больше, см. How to Use the Serializer.

serializer.normalizer

Цель: Зарегистрировать новый нормализатор в сервисе serializer

Тегированный класс должен реализовать NormalizerInterface и DenormalizerInterface.

Чтобы узнать больше, см. How to Use the Serializer.

swiftmailer.default.plugin

Цель: Зарегистрировать пользовательский плагин SwiftMailer

Если вы используете пользовательский плагин SwiftMailer (или хотите его создать), то вы можете зарегистрировать его в SwiftMailer, создав сервис для вашего плагина и тегировав его с помощью swiftmailer.default.plugin (не имеет опций).

Note

default в этом теге - это имя почтовой программы. Если у вас сконфигурировано несколько почтовых программ, или вы именили имя программы по умолчанию по какой-то причине, товам нужно изменить его на имя вашей почтовой программы, чтобы использовать этот тег.

Плагин SwiftMailer должен реализовать интерфейс Swift_Events_EventListener. Чтобы узнать больше о плагинах, см. `Документацию плагина SwiftMailer`_.

Несколько плагинов SwiftMailer являются базовыми в Symfony и могу быть активированы через разные конфигурации. Чтобы узнать больше, см. SwiftmailerBundle Configuration ("swiftmailer").

templating.helper

Цель: Сделать ваш сервис доступным в PHP-шаблонах

Чтобы подключить пользовательский помощник шаблонов, добавьте его в качестве регулярного сервиса в одну из ваших конфигураций, тегируйте его с templating.helper и определите атрибут alias (помощник будет доступен через это дополнительное имя в шаблонах):

  • YAML
    1
    2
    3
    4
    services:
        AppBundle\Templating\AppHelper:
            tags:
                - { name: templating.helper, alias: alias_name }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="AppBundle\Templating\AppHelper">
                <tag name="templating.helper" alias="alias_name" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    use AppBundle\Templating\AppHelper;
    
    $container->register(AppHelper::class)
        ->addTag('templating.helper', array('alias' => 'alias_name'))
    ;
    

translation.loader

Цель: Зарегистрировать пользовательский сервис, загружающий переводы

По умолчанию, переводы загрузаются из файловой системы во множестве разных форматов (YAML, XLIFF, PHP, и др.).

Узнайте, как загружать пользовательские форматы в разделе компонентов.

Теперь, зарегистрируйте ваш загрузчик как сервис и тегируйте его translation.loader:

  • YAML
    1
    2
    3
    4
    services:
        AppBundle\Translation\MyCustomLoader:
            tags:
                - { name: translation.loader, alias: bin }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="AppBundle\Translation\MyCustomLoader">
                <tag name="translation.loader" alias="bin" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use AppBundle\Translation\MyCustomLoader;
    
    $container
        ->register(MyCustomLoader::class)
        ->addTag('translation.loader', array('alias' => 'bin'))
    ;
    

Опция alias обязательна и очень важна: она определяет "суффикс" файла, который будет использован для файлов-источников, использующих этот загрузчик. Например, представьте, что у вас есть некоторый пользовательский формат bin, который вам нужно загрузить. Если у ввс есть файл bin, содержащий французские переводы для домена messages, то у вас может быть файл app/Resources/translations/messages.fr.bin.

Когда Symfony пытается загрузить файл bin, то она передаёт путь вашему пользовательскому загрузчику в качестве аргумента $resource. Вы можете выполнить любую необходимую вам логику в этом файле, чтобы загрузить ваши переводы.

Если вы загружаете переводы из БД, то вам всё равно нужен файл-источник, но он может быть либо пустым, либо содержать немного информации о загрузке этих источников из БД. Цель файла - запустить метод load() в вашем пользовательском загрузчике.

translation.extractor

Цель: Зарегистрировать пользовательский сервис, извлекающий сообщения перевода из файла

При выполненни команды translation:update он использует функции извлечения, чтобы извлечь сообщения переводов из файла. По умолчанию, фреймворк Symfony имеет TwigExtractor и PhpExtractor, которые помогают найти и извлечь ключи переводов из шаблонов Twig и PHP-файлов.

Вы можете создать собственную функцию извлечения, создав класс, реализующий ExtractorInterface и тегировав сервис translation.extractor. Тег имеет одну обязательную опцию: alias, которая определяет имя функции извлечения:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// src/Acme/DemoBundle/Translation/FooExtractor.php
namespace Acme\DemoBundle\Translation;

use Symfony\Component\Translation\Extractor\ExtractorInterface;
use Symfony\Component\Translation\MessageCatalogue;

class FooExtractor implements ExtractorInterface
{
    protected $prefix;

    /**
     * Извлекает сообщения переводов из каталога шаблонов в каталог.
     */
    public function extract($directory, MessageCatalogue $catalogue)
    {
        // ...
    }

    /**
     * Устанавливает префикс, который нужно использовать для найденных сообщений.
     */
    public function setPrefix($prefix)
    {
        $this->prefix = $prefix;
    }
}
  • YAML
    1
    2
    3
    4
    services:
        App\Translation\CustomExtractor:
            tags:
                - { name: translation.extractor, alias: foo }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="App\Translation\CustomExtractor">
                <tag name="translation.extractor" alias="foo" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    use AppBundle\Translation\CustomExtractor;
    
    $container->register(CustomExtractor::class)
        ->addTag('translation.extractor', array('alias' => 'foo'));
    

translation.dumper

Цель: Зарегистрировать пользоветельский сервис, сбрасывающий сообщения перевода

После того, как Extractor извлёк все сообщения из шаблонов, выполняется сброссообщений в файл перевода в специальном формате.

Symfony уже имеет несколько дамперов:

Вы можете создать пользовательский дампер, расширив FileDumper или реализовав DumperInterface и тегировав сервис с помощью translation.dumper. Тег имеет одну опцию: alias. Это имя, которое использовалось для определения, какой дампер применять.

  • YAML
    1
    2
    3
    4
    services:
        AppBundle\Translation\JsonFileDumper:
            tags:
                - { name: translation.dumper, alias: json }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="AppBundle\Translation\JsonFileDumper">
                <tag name="translation.dumper" alias="json" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    use AppBundle\Translation\JsonFileDumper;
    
    $container->register(JsonFileDumper::class)
        ->addTag('translation.dumper', array('alias' => 'json'));
    
Узнайте, как сбрасывать пользовательские форматы в разделе компонентов.

twig.extension

Цель: Зарегистрировать пользовательское расширение Twig

Чтобы подключить расширение Twig, добавьте его в качестве регулярного сервиса к одной из ваших конфигураций и тегируйте его с помощью twig.extension. Если вы используете конфигурацию services.yml по умолчанию, то сервис регистрируется и тегируется автоматически. Но вы также можете зарегистрировать его вручную:

  • YAML
    1
    2
    3
    services:
        AppBundle\Twig\AppExtension:
            tags: [twig.extension]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="AppBundle\Twig\AppExtension">
                <tag name="twig.extension" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use AppBundle\Twig\AppExtension;
    
    $container
        ->register(AppExtension::class)
        ->addTag('twig.extension')
    ;
    

Чтобы узнать, как создать сам класс расширения Twig, см. Документацию Twig по этой теме, или прочтите статью How to Write a custom Twig Extension.

До того, как писать собственные расширения, посмотрите на Официальное хранилище расширений Twig, которое уже включает в себя несколько полезных расширений. Например, Intl и его фильтр localizeddate, который форматирует дату, в соответствии с локалью пользователя. Эти официальные расширения Twig также должны быть добавлены как регулярные сервисы:

  • YAML
    1
    2
    3
    services:
        Twig_Extensions_Extension_Intl:
            tags: [twig.extension]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="Twig_Extensions_Extension_Intl">
                <tag name="twig.extension" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    $container
        ->register('Twig_Extensions_Extension_Intl')
        ->addTag('twig.extension')
    ;
    

twig.loader

Цель: Зарегистрировать пользовательский сервис, загружающий шаблоны Twig

По умолчанию, Symfony использует только один загрузчик Twig - FilesystemLoader. Если вам нужно загрузить шаблоны Twig из другого источника, вы можете создать сервис для нового загрузчика, и тегировать его twig.loader.

Если вы используете конфигурацию services.yml по умолчанию, то сервис будет автоматически тегирован благодаря автоконфигурации. Но вы можете также зарегистрировать его вручную:

  • YAML
    1
    2
    3
    4
    services:
        AppBundle\Twig\CustomLoader:
            tags:
                - { name: twig.loader, priority: 0 }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="AppBundle\Twig\CustomLoader">
                <tag name="twig.loader" priority="0" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    use AppBundle\Twig\CustomLoader;
    
    $container
        ->register(CustomLoader::class)
        ->addTag('twig.loader', array('priority' => 0))
    ;
    

Note

Значение priority необязательно и по умолчанию равняется 0. Загрузчики с более высоким приоритетом загрудаются первыми.

validator.constraint_validator

Цель: Создать собственное пользовательское ограничение валидации

Этот тег позволяет вам создавать и регистрировать ваше собственное ограничение валидации. Чтобы узнать больше, прочтите статью How to Create a custom Validation Constraint.

validator.initializer

Цель: Зарегистрировать сервис, инициализирующий объекты до валидации

Этот тег предоставляет очень нетипичную часть функциональности, позволяющую вам выполнять некоторые действия с объектом прямо перед его валидацие. Например, он используется Doctrine, чтобы запросить все лениво загруженные данные объекта до его валидации. Без этого, некоторые данные в сущности Doctrine будут казаться "отсутствующими" при валидации, несмотря на то, что это не так.

Если вам нужно использовать этот тег, просто создайте новый класс, реализующий интерфейс ObjectInitializerInterface. Потом, тегируйте его тегом validator.initializer (не имеет опций).

Для того, чтобы увидеть пример, смотрите класс DoctrineInitializer внутри Doctrine Bridge.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.