簡體   English   中英

如何重寫Dispatch.php中的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM