2

现在我尝试将我的应用程序从 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 中不再支持 share-function。推荐使用 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);

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

任何想法如何通过一些简单的步骤解决我缺少共享功能的问题,或者您是否认为我必须过度考虑我的整个邮件驱动程序安装。

谢谢

4

1 回答 1

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邮件驱动程序,并且它将调用该闭包来解析驱动程序。

于 2017-01-28T01:00:13.570 回答