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

Я создаю приложение Yii2, которое отправляет электронную почту через расширение swiftmailer . Я сохраняю настройки электронной почты (smtp, ssl, username и т. Д.) В таблице базы данных, чтобы иметь возможность редактировать их с помощью apposite view. Как инициализировать swiftmailer с конфигурацией из таблицы db?

Спасибо.

Related of "Инициировать компонент приложения с конфигурацией из базы данных"

Вы можете инициализировать компоненты приложения с помощью метода 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', ], ]; 

Обратите внимание, что:

Если определение компонента с тем же идентификатором уже существует, оно будет перезаписано.

Официальная документация:

  • BootstrapInterface
  • рассылка

спасибо и @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, ],