在Laravel 5.4中覆盖Mailer服务

问题描述 投票:0回答:1

我试图覆盖MailerIlluminate\Mail\MailServiceProvider的默认实现。

起初,我认为我将扩展服务并随后在容器中切换实现:

软件\邮件\梅勒

<?php

namespace App\Mail;

class Mailer extends \Illuminate\Mail\Mailer
{
    public function getTo()
    {
        return $this->to;
    }
}

软件\供应商\ 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个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.