使用自定义邮件驱动程序

时间:2017-01-27 21:10:12

标签: laravel laravel-5.4

现在我尝试将我的应用程序从Laravel 5.3升级到5.4。除了我的Mailjet自定义邮件驱动程序外,一切正常。

我设置了一个自定义MailServiceProvider来注册Mailjet驱动程序。现在它看起来链接这个(并且与5.3一起工作正常):

<?php

namespace App\Providers;

class MailServiceProvider extends \Illuminate\Mail\MailServiceProvider
{
    public function registerSwiftTransport()
    {
        $this->app['swift.transport'] = $this->app->share(function ($app) {
            return new \App\Mail\Transport\TransportManager($app);
        });
    }
}

在Laravel 5.4中,不再支持共享功能。建议使用singleton()。所以我尝试了几件事。我认为通过以下代码,我非常接近一个可行的解决方案:

public function registerSwiftTransport()
{
     $this->app->singleton('swift.transport', function ($app) {
        return new \App\Mail\Transport\TransportManager($app);
    });
}

但是在这里我得到500错误,因为HandleExceptions.php的空间不足。

我还尝试将自定义TransportManager.php文件移动到\ App \ Providers \并更改了返回行,如下所示:

return new \App\Providers\TransportManager($app);

这里说“未找到”Class'App \ Providers \ TransportManager'。但是:是的,该文件位于正确的目录中。

任何想法如何通过一些简单的步骤解决我的问题与缺少的共享功能,或者你认为我必须超越我的整个maildriver安装。

由于

1 个答案:

答案 0 :(得分:1)

除非TransportManager课程内部出现问题,否则您当前的代码应该有效。但是,有一种更正确的方法来实现新的邮件驱动程序,它完全避免了您遇到的问题。

\Illuminate\Mail\TransportManager类扩展了\Illuminate\Support\Manager类。这意味着该类具有extend()方法,允许您添加自己的自定义驱动程序,而无需首先尝试覆盖整个管理器。

因此,您应该在AppServiceProvider或新的服务提供商中找到类似的内容,而不是当前的解决方案:

<?php

namespace App\Providers;

class MailjetServiceProvider extends \Illuminate\Support\ServiceProvider
{
    public function boot()
    {
        $this->app['swift.transport']->extend('mailjet', function($app) {
            // your logic for building $transport

            return $transport;
        });
    }
}

该服务提供商将允许您使用mailjet邮件驱动程序,它将调用该闭包来解析驱动程序。