Я создаю приложение Yii2, которое отправляет электронную почту через расширение swiftmailer . Я сохраняю настройки электронной почты (smtp, ssl, username и т. Д.) В таблице базы данных, чтобы иметь возможность редактировать их с помощью apposite view. Как инициализировать swiftmailer с конфигурацией из таблицы db?
Спасибо.
Вы можете инициализировать компоненты приложения с помощью метода set (), доступного через объект приложения Yii::$app
:
use Yii; ... // Get config from db here Yii::$app->set('mailer', [ 'class' => 'yii\swiftmailer\Mailer', 'transport' => [ 'class' => 'Swift_SmtpTransport', // Values from db 'host' => ... 'username' => ... 'password' => ... 'port' => ... 'encryption' => ... ], ]);
Затем используйте его как обычно:
use Yii; ... Yii::$app->mailer->...
Если вы хотите использовать одну и ту же конфигурацию из базы данных для всего приложения, вы можете получить и применить эту конфигурацию во время загрузки приложения.
Создайте собственный класс и разместите его, например, в app/components
;
namespace app\components; use yii\base\BootstrapInterface; class Bootstrap implements BootstrapInterface { public function bootstrap($app) { // Put the code above here but replace Yii::$app with $app } }
Затем добавьте это в config:
return [ [ 'app\components\Bootstrap', ], ];
Обратите внимание, что:
Если определение компонента с тем же идентификатором уже существует, оно будет перезаписано.
Официальная документация:
спасибо и @arogachev за его ответ. Это дало мне представление, и я решил проблему. i Опубликовать это для помощи всем
Я решаю проблему modyfing swiftmailer component, в Mailer.php добавил:
use app\models\Administracion; //The model i needed for access bd class Mailer extends BaseMailer { ... ... //this parameter is for the config (web.php) public $CustomMailerConfig = false; ... ... ... /** * Creates Swift mailer instance. * @return \Swift_Mailer mailer instance. */ protected function createSwiftMailer() { if ($this->CustomMailerConfig) { $model = new Administracion(); $this->setTransport([ 'class' => 'Swift_SmtpTransport', 'host' => $model->getSmtpHost(), 'username' => $model->getSmtpUser(), 'password' => $model->getSmtpPass(), 'port' => $model->getSmtpPort(), 'encryption' => $model->getSmtpEncryption(), ]); } return \Swift_Mailer::newInstance($this->getTransport()); }
И в Web.php добавлено:
'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', 'enableSwiftMailerLogging' =>true, 'CustomMailerConfig' => true, //if its true use the bd config else set the transport here 'useFileTransport' => false, ],