2016-09-22 97 views
3

我想重寫Laravels的Mail類的facade方法發送(只是攔截它強制一些檢查,然後如果它通過觸發parent :: send())如何覆蓋Laravel Facade方法?

這樣做的最佳方法是什麼?

+1

你不應該有梅勒進行檢查,這不是它的工作,它只是發送郵件。該邏輯應在外部執行,如果郵件應發送,請調用send方法。 – tam5

+0

@tam您正在談論可維護性和結構,而且我知道,最好不要將責任交給郵件程序。但問題不在於此。 – naneri

回答

6

門面不能這樣工作。它本質上就像一個包裝類,它調用它所代表的基礎類。

Mail外觀實際上沒有send方法。當您做Mail::send()時,引擎蓋下的「外觀訪問器」用於引用在IoC容器中綁定的Illuminate\Mail\Mailer類的實例。正是在這個對象上調用了send方法。

你可以實現你所追求的方式實際上比看起來有點棘手。你可以做的是:

  • 寫自己實現Mailer,延長Illuminate\Mail\Mailer,在其中您可以覆蓋send方法,實現你的支票,並呼籲parent::send()
  • 寫下您自己的服務提供商(擴展Illuminate\Mail\MailServiceProvider),特別是重新實施register方法。它應該創建一個你自己的實例來代替Laravel自己的實例Mailer。 (您可以從Laravel的register方法中複製大部分代碼)。現在
  • ,在config/app.php文件時,providers陣列中,用自己的供應商更換Illuminate\Mail\MailServiceProvider::class,

這應該讓你掛接到Laravel的郵件功能。


欲瞭解更多信息,你可以看看下面的問題/答案,實現類似的事情。它擴展了郵件功能以添加新的傳輸驅動程序,但它採用了類似的方法,因爲它提供了自己的郵件程序實現和服務提供程序。

Add a new transport driver to Laravel's Mailer


應用程序/ MyMailer/Mailer.php

<?php 

namespace App\MyMailer; 

class Mailer extends \Illuminate\Mail\Mailer 
{ 
    public function send($view, array $data = [], $callback = null) 
    { 
     // Do your checks 

     return parent::send($view, $data, $callback); 
    } 
} 

應用程序/ MyMailer/MailServiceProvider.php(大部分從Laravel的MailServiceProvider類複製的代碼的)

<?php 

namespace App\MyMailer; 

class MailServiceProvider extends \Illuminate\Mail\MailServiceProvider 
{ 
    public function register() 
    { 
     $this->registerSwiftMailer(); 

     $this->app->singleton('mailer', function ($app) { 
      // This is YOUR mailer - notice there are no `use`s at the top which 
      // Looks for a Mailer class in this namespace 
      $mailer = new Mailer(
       $app['view'], $app['swift.mailer'], $app['events'] 
      ); 

      $this->setMailerDependencies($mailer, $app); 


      $from = $app['config']['mail.from']; 

      if (is_array($from) && isset($from['address'])) { 
       $mailer->alwaysFrom($from['address'], $from['name']); 
      } 

      $to = $app['config']['mail.to']; 

      if (is_array($to) && isset($to['address'])) { 
       $mailer->alwaysTo($to['address'], $to['name']); 
      } 

      return $mailer; 
     }); 
    } 
} 

配置/ app.php(在供應商陣列)

//... 
// Illuminate\Mail\MailServiceProvider::class, 
App\MyMailer\MailServiceProvider::class, 
//... 
+0

如何從回叫中檢索電子郵件? – naneri

+0

你是什麼意思? – Jonathon

+0

查看我更新的答案,瞭解一些示例代碼 – Jonathon