Mail数据库动态配置
版本laravel10
因为Mail是一个单例 这样的话在队列中/octane模式下不好去检查被配置是否已被更改
<?php
namespace Illuminate\Mail;
use Illuminate\Contracts\Support\DeferrableProvider;
use Illuminate\Support\ServiceProvider;
class MailServiceProvider extends ServiceProvider implements DeferrableProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->registerIlluminateMailer();
$this->registerMarkdownRenderer();
}
/**
* Register the Illuminate mailer instance.
*
* @return void
*/
protected function registerIlluminateMailer()
{
$this->app->singleton('mail.manager', function ($app) {
return new MailManager($app);
});
$this->app->bind('mailer', function ($app) {
return $app->make('mail.manager')->mailer();
});
}
}
所以在AppServiceProvider的boot方法中去覆盖单例注册 改成范围单例
$this->app->scoped('mail.manager', fn($app) => new MailManager($app));
然后每次解析Mail触发会回调 这里的驱动应该固定是smtp
Mail::resolved(function (MailManager $mail) {
$driver = system_config()->mailMailer();
$config = config("mail.mailers.$driver");
$config['host'] = system_config()->mailHost();
$config['port'] = system_config()->mailPort();
$config['username'] = system_config()->mailUsername();
$config['password'] = system_config()->mailPassword();
$config['encryption'] = system_config()->mailEncryption();
config()->set('mail.from.address', system_config()->mailFromAddress());
config()->set('mail.from.name', system_config()->mailFromName());
config()->set("mail.mailers.$driver", $config);
$mail->setDefaultDriver($driver);
});
如果存在问题请大佬们帮忙指出
推荐文章: