我想重寫Laravels的Mail類的facade方法發送(只是攔截它強制一些檢查,然後如果它通過觸發parent :: send())如何覆蓋Laravel Facade方法?
這樣做的最佳方法是什麼?
我想重寫Laravels的Mail類的facade方法發送(只是攔截它強制一些檢查,然後如果它通過觸發parent :: send())如何覆蓋Laravel Facade方法?
這樣做的最佳方法是什麼?
門面不能這樣工作。它本質上就像一個包裝類,它調用它所代表的基礎類。
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,
//...
你不應該有梅勒進行檢查,這不是它的工作,它只是發送郵件。該邏輯應在外部執行,如果郵件應發送,請調用send方法。 – tam5
@tam您正在談論可維護性和結構,而且我知道,最好不要將責任交給郵件程序。但問題不在於此。 – naneri