Laravel 5.4中的重写Mailer服务

时间:2018-09-18 04:04:23

标签: php dependency-injection laravel-5.4 service-provider

我正在尝试覆盖MailerIlluminate\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\MailServiceProviderdeferred服务的提供者,因此总是会被优先使用。我也尝试将服务提供者定义为$defer = true,但是没有运气。

我能想到的唯一选择是完全删除Illuminate\Mail\MailServiceProvider并将其替换为自定义选项。但这似乎有点苛刻。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

解决此问题的唯一方法是将Laravel升级到版本5.5及更高版本。固定版本在this PR中被引用,在5.4中将不被固定,因为不再支持该版本。