使用来自数据库的配置初始化应用程序组件
Init application component with config from database
我正在构建一个通过 swiftmailer extension 发送电子邮件的 Yii2 应用程序。我将电子邮件设置(smtp、ssl、用户名等)存储在数据库 table 中,以便能够使用适当的视图对其进行编辑。
我如何使用数据库中的配置初始化 swiftmailer table?
谢谢。
您可以通过应用程序对象 Yii::$app
:
使用 set() 方法初始化应用程序组件
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->...
如果您想对整个应用程序使用来自数据库的相同配置,您可以在应用程序期间获取并应用此配置 bootstrap。
创建自定义 class 并将其放置在例如 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
}
}
然后在配置中添加:
return [
[
'app\components\Bootstrap',
],
];
注意:
If a component definition with the same ID already exists, it will be
overwritten.
官方文档:
感谢@arogachev 的 answer.that 给了我一个想法,我解决了这个问题。我 Post 这是为了帮助任何人
我解决了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,
],
我正在构建一个通过 swiftmailer extension 发送电子邮件的 Yii2 应用程序。我将电子邮件设置(smtp、ssl、用户名等)存储在数据库 table 中,以便能够使用适当的视图对其进行编辑。 我如何使用数据库中的配置初始化 swiftmailer table?
谢谢。
您可以通过应用程序对象 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->...
如果您想对整个应用程序使用来自数据库的相同配置,您可以在应用程序期间获取并应用此配置 bootstrap。
创建自定义 class 并将其放置在例如 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
}
}
然后在配置中添加:
return [
[
'app\components\Bootstrap',
],
];
注意:
If a component definition with the same ID already exists, it will be overwritten.
官方文档:
感谢@arogachev 的 answer.that 给了我一个想法,我解决了这个问题。我 Post 这是为了帮助任何人
我解决了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,
],