覆盖 Laravel 5.4 中的 Mailer 服务
Overriding Mailer service in Laravel 5.4
我正在尝试覆盖 Illuminate\Mail\MailServiceProvider
中 Mailer
的默认实现。
一开始,我以为我只是扩展服务,然后切换容器中的实现:
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;
});
}
}
The problem is that even though I've overridden the container definition when resolving the service it ignores my definition completely because Illuminate\Mail\MailServiceProvider
has $defer = true
property, meaning that it will get resolved in a special way like this:
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
并用自定义的替换它。但这似乎有点苛刻。
有什么想法吗?
解决此问题的唯一方法是将 Laravel 升级到版本 5.5
及更高版本。 this issue 中引用了固定版本,由于不再支持该版本,因此不会在 5.4
中固定。
我正在尝试覆盖 Illuminate\Mail\MailServiceProvider
中 Mailer
的默认实现。
一开始,我以为我只是扩展服务,然后切换容器中的实现:
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;
});
}
}
The problem is that even though I've overridden the container definition when resolving the service it ignores my definition completely because
Illuminate\Mail\MailServiceProvider
has$defer = true
property, meaning that it will get resolved in a special way like this:
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
并用自定义的替换它。但这似乎有点苛刻。
有什么想法吗?
解决此问题的唯一方法是将 Laravel 升级到版本 5.5
及更高版本。 this issue 中引用了固定版本,由于不再支持该版本,因此不会在 5.4
中固定。