在实现中实现存储库接口

时间:2018-07-31 00:11:26

标签: php laravel laravel-5 lumen

我正在尝试将接口实现为Job,但是没有运气。是否可以在公共构造中实现接口/存储库,并在Job的handle()方法中使用所述接口?

我得到的错误如下:

Argument 1 passed to App\Jobs\OrderCreate::__construct() must be an instance of App\Http\Interfaces\OrderInterface, string given, called in /Users/Panoply/Sites/stock-sync/app/Http/Controllers/StockController.php on line 31

以下是我要实现的基本设置。

库存控制员:

public function test(){
   dispatch(new OrderCreate('hello'));
}

OrderCreate作业:

protected $order;
protected $test;

public function __construct(OrderInterface $order, $test)
{
    $this->order = $order;
    $this->test = $test;
}

public function handle()
{
    $this->order->test($this->test);
}

OrderRepository:

class OrderRepository implements OrderInterface
{
    public function test($data) {
        error_log($data);
    }
}

OrderInterface:

public function test($data);

我在我的控制器和命令中实现此模式没有任何麻烦,但似乎无法在Job上运行它。

1 个答案:

答案 0 :(得分:0)

没关系,问题是我不应该在__construct()内调用接口,而应该在handle()内调用

编辑以获取更详细的说明。

据我所知,Laravel / Lumen Job的__construct()仅接受数据,因此在__constuct()中实现接口将引发上述错误。

要在作业中使用接口,您将需要在handle()函数中调用接口。

例如,以下内容将在Job类中起作用:

protected $test;

public function __construct(InterfaceTest $test)
{
     $this->test = $test;
}

这是因为Job构造不接受Interfaces,它仅接受您从dispatch调用传入的数据。为了在作业中使用接口,您需要在handle()函数中调用该接口,然后该接口将成功并起作用,例如:

public function handle(InterfaceTest $test)
{
     $test->fn();
}

这似乎只有在Job上实现时才是这种情况。在大多数情况下,当需要在Controller或Command中使用接口时,可以在__construct()中实现。