繁体   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