我正在尝试覆盖Mailer
中Illuminate\Mail\MailServiceProvider
的默认实现。
起初,我以为我会扩展服务并随后在容器中切换实现:
App \ Mail \ 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
属性,这意味着它将以特殊方式解析,例如这个:
Illuminate \ Foundation \ Application
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
并将其替换为自定义选项。但这似乎有点苛刻。
有什么想法吗?