[英]How to override methods in Dispatch.php
我正在用超過10個文件對$ connection和$ queue進行硬編碼,因此我試圖進行清理。 我的第一個想法是創建一些可以在所有這些文件中訪問的助手。 但是,我不需要整個應用程序中都可用的那些方法/變量。 相反,將它們放置在ShouldQueue類中是最有意義的。 對執行此操作的正確方法有何想法?
namespace App\Listeners\User;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Log;
class CreateJenzUser implements ShouldQueue
{
use InteractsWithQueue;
public $connection = 'sqs_high';
public $queue = 'portal_high.fifo';
//Would rather use
public $connection = $highConnection;
public function handle(UserBeingCreated $event)
{
}
}
編輯
事實證明Laravel在沒有構造函數的情況下創建了CreateJenzUser的新實例。
供應商/laravel/framework/src/Illuminate/Events/Dispatcher.php-第479行
/**
* Create the listener and job for a queued listener.
*
* @param string $class
* @param string $method
* @param array $arguments
* @return array
*/
protected function createListenerAndJob($class, $method, $arguments)
{
$listener = (new ReflectionClass($class))->newInstanceWithoutConstructor();
return [$listener, $this->propagateListenerOptions(
$listener, new CallQueuedListener($class, $method, $arguments)
)];
}
只需要弄清楚如何重寫此方法即可。
我將創建一個父抽象類 ,並從需要使用隊列的所有類中擴展它。 您可以在父類中指定必須作為抽象方法實現的所有方法,因此您無需實現ShouldQueue
接口。
因此,父類看起來像
abstract class Queue
{
use InteractsWithQueue;
protected $connection = 'sqs_high';
protected $queue = 'portal_high.fifo';
// list here all the methods in your ShouldQueue interface
abstract protected function handle(UserBeingCreated $event);
}
然后是子類:
class CreateJenzUser extends Queue
{
protected function handle(UserBeingCreated $event)
{
// your code here
}
}
更新資料
如果需要保留接口(例如,用於類型提示檢查),則可以同時擴展和實現。 因此,在這種情況下,子類如下所示:
class CreateJenzUser extends Queue implements ShouldQueue
{
protected function handle(UserBeingCreated $event)
{
// your code here
}
}
在這種情況下, Queue
類可能不需要是抽象的。 但是,這取決於您要如何設計。 如果您有一些要從父級調用但在子級中定義的方法,則仍可以將其保留為抽象類。
聽起來所有這些類都共享代碼,應該對其進行重構。 最好的選擇可能是提取類 ,然后將其作為依賴項傳遞給需要該行為的類的構造函數。
您還應該考慮以下事實,即trait
基本上是解釋器輔助的復制粘貼。 您只是使用一種語言結構來隱藏該代碼重復。
聚苯乙烯
不要使用extends
來解決此問題。 “ extends”關鍵字應讀作“是...的特殊子類型”。 而且用戶不是特殊的隊列類型……坦率地說,有些人會認為這是一種侮辱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.