Использование разных параметров transport для одного компонента mailer

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Использование разных параметров transport для одного компонента mailer

Сообщение long399 »

Здравствуйте, возник такой вопрос. Есть один компонент mailer, но в разных местах для него надо использовать разные конфиги (свойство transport). Решением "в лоб" было бы завести 2 отдельных компонента, но так делать не хочется.

Код: Выделить всё

'mailer1' => [
    // config 1
],
'mailer2' => [
    // config 2
],
Подскажите, пожалуйста, как это лучше и главное правильнее сделать в Yii2? Не через Dependency Injection Container? Желательно с примером :oops: Я с ним пока не сталкивался, поэтому нюансов не знаю.
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Re: Использование разных параметров transport для одного компонента mailer

Сообщение long399 »

ElisDN писал(а): 2021.08.24, 05:13 Именно сделать два компонента.
Дмитрий, благодарю за ответ. Но если брать экстремальный случай, например, когда у нас будет 20 разных учетных записей, с которых необходимо отправлять письма? В этом случае мы ведь будем действовать уже как-то иначе? Мне вот этот момент именно понять хотелось бы.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Использование разных параметров transport для одного компонента mailer

Сообщение ElisDN »

Тогда сделать компонент-фабрику, который будет создавать мэйлер по переданной учётной записи.
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Re: Использование разных параметров transport для одного компонента mailer

Сообщение long399 »

ElisDN писал(а): 2021.08.25, 11:14 Тогда сделать компонент-фабрику, который будет создавать мэйлер по переданной учётной записи.
Благодарю за совет.

Создал вот такой класс фабрики:

Код: Выделить всё

<?php

namespace common\factory;

use Yii;
use yii\mail\MailerInterface;
use yii\swiftmailer\Mailer;
use yii\base\NotSupportedException;

class MailerFactory
{
    /**
     * @param int $category
     * @return MailerInterface
     * @throws NotSupportedException
     */
    public static function getMailerByCategory(int $category): MailerInterface
    {
        /** @var \yii\swiftmailer\Mailer $mailer */
        $mailer = Yii::createObject(Mailer::class);

        switch ($category) {
            case 0:
                $mailer->setTransport([
                    // config 1
                ]);
                break;
            case 1:
                $mailer->setTransport([
                    // config 2
                ]);
        }

        return $mailer;
    }
}
И в container в конфиге добавил класс мейлера:

Код: Выделить всё

'container' => [
        'definitions' => [
            \yii\swiftmailer\Mailer::class => [
                'class' => 'yii\swiftmailer\Mailer',
                'viewPath' => '@common/mail',
                'htmlLayout' => 'layouts/html',
                'textLayout' => 'layouts/text',
                'useFileTransport' => false,
            ],
        ]
    ]
Сам mailer создаю в методе модели перед отправкой письма.

Код: Выделить всё

public function sendEmail()
    {
        $mailer = MailerFactory::getMailerByCategory($this->category);

        /** @var \yii\swiftmailer\Mailer $mailer */
        return $mailer
            ->compose(
                ['html' => 'question-html', 'text' => 'question-text'],
                ['question' => $this]
            )
            ->setFrom(...)
            ->setTo(...)
            ->setReplyTo(...)
            ->setSubject(...)
            ->send();
    }
Не знаю насколько это правильно, но работает. Буду благодарен за замечания/советы.
Ответить