问题 在运行时更改服务配置参数


我正在使用mailgun发送Laravel 5.2的邮件。它在config / services.php上配置如下:

    'mailgun' => [
        'domain' => env('mailgun_domain','mydomain.com'),
        'secret' => env('mailgin_secret','my-secret-key-132152345423')
    ],

但是,我需要在调用Mail :: send之前在运行时更改该设置,以使用正确的服务参数。它必须在运行时多次更改。

一世 无法通过.env文件配置它,因为所有数据都将从数据库中获取,用户在其中设置域和密钥。


7505
2017-08-10 12:50


起源

你知道它们的设置是什么,或者它们是否总是从其他来源改变/动态拉出? - Jared Eitnier
代码必须在发送邮件之前更改“mailgun”域和秘密。该数据将存储在数据库中。我需要在执行期间多次更改它。 - Tiago Gouvêa
@ alexey-mezenin提出的解决方案适用于第一次更改,之后,它不会再改变了......只是第一个值仍然存在。 - Tiago Gouvêa
是的,我明白你需要做什么。这是一个非常独特的场景。让我想想。 - Jared Eitnier
代表您的用户发送邮件时,您绝不应将其凭据用作全局设置!如果应用在同一请求期间调度其他邮件,例如通知管理员一个事件... @JaredEitnier的答案是要走的路。 - jsphpl


答案:


您可以在运行时动态设置配置值 config() 帮手:

config(['services.mailgun' => $arrayWithNewSettings]);

15
2017-08-10 12:59



谢谢@ alexey-mezenin,当我第一次在运行时设置它时,它运行良好。但是当我改变它时,如果我得到了配置值,那没关系,但是当Mail使用它时,只有第一个值就在那里......只有第一个配置保留在那里。我需要强制服务来重新加载配置... - Tiago Gouvêa
这不是“设置”,如果先前未设置,则返回一个值。 - astroanu
@astroanu在downvoting之前你实际上可以阅读文档 laravel.com/docs/5.3/... - Alexey Mezenin
@astroanu, Config::set($key, $value) 是相同的 config(['services.mailgun' => $arrayWithNewSettings]);。获得您正在使用的价值 config('services.mailgun');。再次阅读文档。 - Alexey Mezenin
我想它确实如此。没有看到。 - astroanu


我想如果你跟着 这个例子 你会走在正确的轨道上。

\Illuminate\Mail\TransportManager.php 有一个方法 createMailgunDriver() 这是从硬盘位置提取服务,默认情况下不可更改。

您需要编写自己的服务提供商,扩展 MailServiceProvider 并滚动您自己的传输,以便您可以按照您想要的方式从数据库中提取设置。


0
2017-08-15 20:06



好的......我明天会试试。谢谢! - Tiago Gouvêa
现在检查..我不对,如果它将工作以及如何实现它.. :( - Tiago Gouvêa
@TiagoGouvêa您在实施上述解决方案时遇到了什么问题? - jaysingkar
@jaysingkar我只是不知道如何/在哪里开始它.. - Tiago Gouvêa
@TiagoGouvêa我检查了答案,你可以做的是检查答案,尝试通过创建每个文件来实现它,让我知道你陷入困境的步骤 - jaysingkar