覆盖 Laravel 5.4 中的 Mailer 服务

Overriding Mailer service in Laravel 5.4

我正在尝试覆盖 Illuminate\Mail\MailServiceProviderMailer 的默认实现。

一开始,我以为我只是扩展服务,然后切换容器中的实现:

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 中固定。