Php 从Laravel中的命令调用控制器方法
我有一个通过Redis Pub/Sub监听的命令。当接收到发布时,我想调用一个控制器方法,以便更新数据库 但是,对于如何使用项目内部但路由外部的参数调用控制器方法,我还没有找到任何解决方案。我见过的最接近的东西是:Php 从Laravel中的命令调用控制器方法,php,laravel,redis,laravel-controller,Php,Laravel,Redis,Laravel Controller,我有一个通过Redis Pub/Sub监听的命令。当接收到发布时,我想调用一个控制器方法,以便更新数据库 但是,对于如何使用项目内部但路由外部的参数调用控制器方法,我还没有找到任何解决方案。我见过的最接近的东西是: return redirect()->action( 'TransactionController@assignUser', [ 'transId' => $trans_id, 'user
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代替它,效果很好,谢谢!另一方面,这不是“推荐”的方法吗?我觉得听一个频道并通过控制器更新数据库是一件明智的事情,但我基本上没有发现关于它的信息。制作控制器对象是否会在很长一段时间内持续导致性能问题?不,它不应该导致性能问题,但这实际上取决于控制器的大小。我不知道这是否是推荐的方法,但当我需要重用函数而模型或存储库中没有函数时,我会在一些命令和其他地方使用这种方法。