Symfony: l10n локализация. Передача дополнительных параметров через DI

Localization (l10n), translation, переводы

config/services.yaml

parameters:
    locale: 'en' # изменить на ru

в папке translations создаем файл exceptions.ru.php с содержимым перевода

<?php

return [
    'User is not found.' => 'Пользователь не найден.',
    'Incorrect or confirmed token.' => 'Некорректный или уже активированный токен.',
    //....
]

в конструкторе контроллера (например SingUpController.php) необходимо передать переводчик —

public function __construct(LoggerInterface $logger, TranslatorInterface $translator) 
{
    ...
    $this->translator = translator;
    ...
}

и в нужном месте вызвать метод для перевода

$this->translator->trans($e->getMessage(), [], 'exceptions'));

в который передается само сообщение, параметры (например числа, подстановки и т.п.) и домен из которого будут подставляться соотвествующие переводы (в данном случае из файла exceptions.ru.php)

Также переводчик можно настраивать в файле config/packages/translation.yaml

Dependency injection (DI)

В Symfony есть возможность использовать внедрение зависимостей через контейнеры, кроме того в Симфони есть autowiring, но если в конструктор контейнера необходимо передать дополнительный параметр (который не может быть использован или определен через DI), то в Симфони необходимо указать какие параметры и как должны быть переданы.
Настроить текущие зависимости и указать дополнительные можно в конфиге config/services.yaml

...
services:
    ...
    App\Model\User\Service\TokenSender:
        $from: {'%env(MAILER_FROM_EMAIL)%': '%env(MAILER_FROM_NAME)%'}

    App\Model\User\Service\ResetToken:
        factory: 'App\Container\Model\Service\ResetTokenFactory:create'
        arguments: ['PT1H']
    ...

Помимо конфигов необходимо добавить фабрику, которая будет передавать дополнительные параметры в конструктор класса ResetToken

<?php

namespace App\Container\Model\User\Service;

use App\Model\User\Service\ResetTokenizer;
use DateInterval;

class ResetTokenizerFactory
{
    public function create(string $interval): ResetTokenizer
    {
        return new ResetTokenizer(new DateInterval($interval));
    }
}

Для того, чтобы каждый раз не проставлять конфиги в SwiftMailer (избежать дублирование) можно воспользоваться пакетом"finesse/swiftmailer-defaults-plugin" и теперь в конфигах (config/services.yaml) достаточно настроить параметры для этого пакета один раз

    Finesse\SwiftMailerDefaultsPlugin\SwiftMailerDefaultsPlugin:
        arguments:
            $defaults:
                from: { '%env(MAILER_FROM_EMAIL)%': '%env(MAILER_FROM_NAME)%' }

и в коде уже можно не вызывать метод setFrom для SwiftMailer

Leave a comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.