2017-01-27 2 views
2

Сейчас я пытаюсь обновить свое приложение от Laravel 5.3 до 5.4. Все работало отлично, за исключением моего почтового драйвера для Mailjet.Переключиться с share на singleton с помощью настраиваемого почтового драйвера

Я установил пользовательский 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); 

Вот он говорит: «Класс 'App \ Providers \ TransportManager' не найден ». Но: Да, файл находится в правильном каталоге.

Любые идеи о том, как решить мою проблему с отсутствующей функцией совместного доступа в несколько простых шагов или, по-вашему, я должен переусердствовать по всей моей установке maildriver.

Благодаря

+0

Какое пространство имен у вашего поставщика транспорта? – Paras

+0

Да, я забыл установить его в App \ Providers после перемещения файла. Но когда я меняю это, я также получаю ошибку 500. –

ответ

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 почты , и он будет называть это закрытие для разрешения драйвера.

Смежные вопросы