首页 > 解决方案 > 在 Laravel 5.4 中覆盖邮件服务

问题描述

我正在尝试覆盖Mailerin的默认实现Illuminate\Mail\MailServiceProvider

起初,我以为我只是扩展服务并在容器中切换实现如下:

应用\邮件\邮件程序

<?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并用自定义替换它。但这似乎有点苛刻。

有任何想法吗?

标签: phpdependency-injectionlaravel-5.4service-provider

解决方案


The only way to solve this issue is to upgrade Laravel to version 5.5 and above. The fixed version is referenced in this issue and won't be fixed in 5.4 since the version is no longer supported.


推荐阅读