【问题标题】:Overriding Mailer service in Laravel 5.4在 Laravel 5.4 中覆盖邮件服务
【发布时间】:2019-02-22 00:41:39
【问题描述】:

我正在尝试在Illuminate\Mail\MailServiceProvider 中覆盖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 属性,这意味着它将以如下特殊方式得到解决:

照亮\基础\应用程序

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

有什么想法吗?

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 2017-10-27
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2019-01-13
    • 2019-05-12
    相关资源
    最近更新 更多