Прикладной компонент init с конфигурацией из базы данных

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

Спасибо.

2

Решение

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

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

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

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

11

Другие решения

Спасибо и @arogachev за его ответ. Это дало мне идею, и я решил проблему. я отправлю это для помощи любому

я решаю проблему modyfing компонент swiftmailer, в 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,
],
0

По вопросам рекламы [email protected]