【问题标题】:Implement a Repository Interface into Job在作业中实现存储库接口
【发布时间】:2018-07-31 00:11:26
【问题描述】:

我正在尝试将接口实现到作业中,但没有运气。是否可以在公共构造中实现接口/存储库并在作业的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'));
}

订单创建工作:

protected $order;
protected $test;

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

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

订单仓库:

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

订单接口:

public function test($data);

在我的控制器和命令中实现这种模式没有任何问题,但我似乎无法让它在作业中运行。

【问题讨论】:

    标签: php laravel laravel-5 lumen


    【解决方案1】:

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

    编辑以获得更详细的解释。

    据我所知,Laravel / Lumen Job 的__construct() 只接受数据,因此在__constuct() 中实现接口将导致我的上述错误被抛出。

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

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

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

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

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

    这似乎只有在 Job 上实现时才会出现。在大多数情况下,当您需要控制器或命令中的接口时,您将在__construct() 中实现。

    【讨论】:

    • 请分享您的解决方案,它可以帮助其他人。谢谢!!
    • @SachinVairagi 为可能遇到此问题的任何人提供了更多解决方案。
    猜你喜欢
    • 2015-02-13
    • 2012-11-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多