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