2016-10-03 5 views
3

Использование mailgun в качестве почтового драйвера У меня возникла проблема с тем, что слепая копия не работает должным образом, так как она показывает все адреса всем получателям. Я нашел исправление, которое решило бы проблему, но для редактирования файла MailgunTransport.php требуется файл vendor/laravel/framework/src/Illuminate/Mail/Transport/MailgunTransport.php. Я не хочу, чтобы изменить файл на вендоры папку, так что я пытаюсь продлить этот класс MailgunTransport ...Переопределить класс MailGunTransport в Laravel 4.2

Я создал папку с именем приложения/пользовательский/расширения с двумя файлами, CustomMailServiceProvider ...

<?php namespace custom\extensions; 

use Swift_Mailer; 
use Illuminate\Support\ServiceProvider; 
use Swift_SmtpTransport as SmtpTransport; 
use Swift_MailTransport as MailTransport; 
use Illuminate\Mail\Transport\LogTransport; 
use custom\extensions\CustomMailgunTransport; 
use Illuminate\Mail\Transport\MandrillTransport; 
use Swift_SendmailTransport as SendmailTransport; 

class CustomMailServiceProvider extends \Illuminate\Mail\MailServiceProvider { 

} 

... и CustomMailgunTransport.php

<?php namespace custom\extensions; 

class CustomMailgunTransport extends Illuminate\Mail\Transport\MailgunTransport { 
    /** 
    * {@inheritdoc} 
    */ 
    public function send(Swift_Mime_Message $message, &$failedRecipients = null) 
    {   
     $client = $this->getHttpClient(); 
     $to = $this->getTo($message); 
     $message->setBcc([]); 

     $client->post($this->url, ['auth' => ['api', $this->key], 
      'body' => [ 
       'to' => $to, 
       'message' => new PostFile('message', (string) $message), 
      ], 
     ]); 
    } 
} 

CustomMailServiceProvider.php не переопределяют любые оригинальные методы, но изменяет вызов из исходного MailgunTransport в пользовательские расширения \ \ CustomMailgunTransport.

Я загрузил каталог приложений/пользовательский/расширения новых файлов в composer.json classmap ...

{ 
    ... 
    "autoload": { 
     "classmap": [ 
      ... 
      "app/custom/extensions"     
     ],  
    }, 
    ... 
} 

И я сменил оригинальный «Осветите \ почту \ MailServiceProvider» до «обычая \ расширения \ CustomMailServiceProvider»...

'providers' => array(
    ... 
    //'Illuminate\Mail\MailServiceProvider', 
    'custom\extensions\CustomMailServiceProvider', 
    ... 
), 

Однако, на данный момент я не знаю, как назвать почты функций. Если я пытаюсь использовать фасад Mail, он использует исходный код из MailgunTransport.php

Нужно ли создавать пользовательский фасад? и если так ... Как я могу это сделать? Или есть проблемы с кодом выше? Есть ли способ расширить только MailgunTransport.php без создания CustomMailServiceProvider?

ответ

0

Я решил это, включив метод registerMailgunTransport в CustomMailServiceProvider и указав там новый CustomMailgunTransport.

CustomMailServiceProvider

<?php namespace custom\extensions; 

use Swift_Mailer; 
use Illuminate\Support\ServiceProvider; 
use Swift_SmtpTransport as SmtpTransport; 
use Swift_MailTransport as MailTransport; 
use Illuminate\Mail\Transport\LogTransport; 
use custom\extensions\CustomMailgunTransport; 
use Illuminate\Mail\Transport\MandrillTransport; 
use Swift_SendmailTransport as SendmailTransport; 

class CustomMailServiceProvider extends \Illuminate\Mail\MailServiceProvider { 
/** 
* Register the Mailgun Swift Transport instance. 
* 
* @param array $config 
* @return void 
*/ 
    protected function registerMailgunTransport($config) 
    { 
     $mailgun = $this->app['config']->get('services.mailgun', array()); 

     $this->app->bindShared('swift.transport', function() use ($mailgun) 
     { 
      return new CustomMailgunTransport($mailgun['secret'], $mailgun['domain']); 
     }); 
    } 
} 

CustomMailgunTransport

<?php namespace custom\extensions; 

use Swift_Transport; 
use GuzzleHttp\Client; 
use Swift_Mime_Message; 
use GuzzleHttp\Post\PostFile; 
use Swift_Events_EventListener; 

class CustomMailgunTransport extends \Illuminate\Mail\Transport\MailgunTransport { 
    /** 
    * {@inheritdoc} 
    */ 
    public function send(Swift_Mime_Message $message, &$failedRecipients = null) 
    {   
     $client = $this->getHttpClient(); 
     $to = $this->getTo($message); 
     $message->setBcc([]); 

     $client->post($this->url, ['auth' => ['api', $this->key], 
      'body' => [ 
       'to' => $to, 
       'message' => new PostFile('message', (string) $message), 
      ], 
     ]); 
    } 
}