【发布时间】:2019-02-22 00:41:39
【问题描述】:
我正在尝试在Illuminate\Mail\MailServiceProvider 中覆盖Mailer 的默认实现。
一开始我以为我只是扩展服务并在容器中切换实现如下:
应用\邮件\邮件程序
<?php
namespace App\Mail;
class Mailer extends \Illuminate\Mail\Mailer
{
public function getTo()
{
return $this->to;
}
}
App\Providers\AppServiceProvider
<?php
namespace App\Providers;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton('mailer', function (Container $app) {
// ...
$mailer = new \App\Mail\Mailer(
$app['view'], $app['swift.mailer'], $app['events']
);
// ...
return $mailer;
});
}
}
问题是,即使我在解析服务时覆盖了容器定义,它也会完全忽略我的定义,因为
Illuminate\Mail\MailServiceProvider具有$defer = true属性,这意味着它将以如下特殊方式得到解决:
照亮\基础\应用程序
public function make($abstract)
{
$abstract = $this->getAlias($abstract);
if (isset($this->deferredServices[$abstract])) {
$this->loadDeferredProvider($abstract);
}
return parent::make($abstract);
}
所以,我尝试覆盖该服务并不重要,因为Illuminate\Mail\MailServiceProvider 总是会得到首选,因为它是deferred 服务提供者。我也尝试将我的服务提供者定义为$defer = true,但没有运气。
我能想到的唯一选择是完全删除 Illuminate\Mail\MailServiceProvider 并用自定义替换它。但这似乎有点苛刻。
有什么想法吗?
【问题讨论】:
-
我可以看到这个提交有 [5.4] 前缀,但它从未进入 5.4 分支:github.com/laravel/framework/pull/20714/files
标签: php dependency-injection laravel-5.4 service-provider