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

Sta*_*son 3 php redis laravel laravel-controller

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

但是,我无法找到有关如何从项目内部但在路由外部使用参数调用控制器方法的任何解决方案。我见过的最接近的事情是这样的:

    return redirect()->action(
        'TransactionController@assignUser', [
               'transId' => $trans_id,
               'userId' => $user_id
        ]);
Run Code Online (Sandbox Code Playgroud)

我尝试过的完整命令如下所示:

<?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
            ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用。当我运行此命令时,出现无法找到assignUser() 的错误(即使它存在并且需要两个参数)。我也不确定“重定向”是否真的是我在这里所追求的。

有没有其他方法可以在命令中调用控制器函数,或者其他方法可以做到这一点?

ayn*_*ber 8

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

$controller = new TransactionController();
$controller->assignUser([
           'transId' => $trans_id,
           'userId' => $user_id
        ]);
Run Code Online (Sandbox Code Playgroud)

  • 如果您的控制器确实有依赖项,您可以用 `resolve('App\Http\Controllers\TransactionController')` 代替 (5认同)