Php 从Laravel中的命令调用控制器方法

Php 从Laravel中的命令调用控制器方法,php,laravel,redis,laravel-controller,Php,Laravel,Redis,Laravel Controller,我有一个通过Redis Pub/Sub监听的命令。当接收到发布时,我想调用一个控制器方法,以便更新数据库 但是,对于如何使用项目内部但路由外部的参数调用控制器方法,我还没有找到任何解决方案。我见过的最接近的东西是: return redirect()->action( 'TransactionController@assignUser', [ 'transId' => $trans_id, 'user

我有一个通过Redis Pub/Sub监听的命令。当接收到发布时,我想调用一个控制器方法,以便更新数据库

但是,对于如何使用项目内部但路由外部的参数调用控制器方法,我还没有找到任何解决方案。我见过的最接近的东西是:

    return redirect()->action(
        'TransactionController@assignUser', [
               'transId' => $trans_id,
               'userId' => $user_id
        ]);
我尝试过的完整命令如下所示:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;

class RedisSubscribe extends Command
{

    protected $signature = 'redis:subscribe';

    protected $description = 'Subscribe to a Redis channel';

    public function handle()
    {
        Redis::subscribe('accepted-requests', function ($request) {

            $trans_array = json_decode($request);
            $trans_id = $trans_array->trans_id;
            $user_id = $trans_array->user_id;

            $this->assignUser($trans_id, $user_id);
        });
    }

    public function assignUser($trans_id, $user_id)
    {
         return redirect()->action(
            'TransactionController@assignUser', [
               'transId' => $trans_id,
               'userId' => $user_id
            ]);
    }
}

如果您的控制器没有任何必需的参数,您可以将控制器创建为新对象,然后调用函数

$controller = new TransactionController();
$controller->assignUser([
           'transId' => $trans_id,
           'userId' => $user_id
        ]);

顺便说一句,
$this
不起作用,因为您正处于关闭状态。这就是为什么会出现“未找到”错误。@Vincent Decaux哦,你说得对。如果我不包括$this,它似乎根本无法在命令类中找到该方法。有没有一种方法可以让我重新设计它,这样我就可以在订阅时实际调用一个方法?如果你的控制器确实有依赖项,你可以
resolve('App\Http\Controllers\TransactionController')
it代替它,效果很好,谢谢!另一方面,这不是“推荐”的方法吗?我觉得听一个频道并通过控制器更新数据库是一件明智的事情,但我基本上没有发现关于它的信息。制作控制器对象是否会在很长一段时间内持续导致性能问题?不,它不应该导致性能问题,但这实际上取决于控制器的大小。我不知道这是否是推荐的方法,但当我需要重用函数而模型或存储库中没有函数时,我会在一些命令和其他地方使用这种方法。