Laravel- Jobs - 将 0 作为结果返回给模块内的控制器

Posted

技术标签:

【中文标题】Laravel- Jobs - 将 0 作为结果返回给模块内的控制器【英文标题】:Laravel- Jobs -returning 0 as result to controller inside a module 【发布时间】:2017-08-08 18:56:19 【问题描述】:

我正在使用 laravel 5.4 并使用 nWidart/laravel-modules 来实现模块概念。

->创建了一个 controller ,通过我在 laravel 中使用作业概念调用 job 的控制器 我写了一个 post 方法,首先我在控制器中捕获它,然后将请求数组发送到作业以插入表中 该过程工作正常,如果我在作业中打印结果,则对象正在成功打印 但是当我将它返回给控制器时,它显示为“0”

-->然后我尝试返回一个正常的 字符串 仍然显示 0 作为控制器中的响应

我的控制器

public function store(Request $request)
    
        $user = dispatch(new CheckJob($request));
        return $user;
    

我的工作

public function __construct($requestParams)
    

        $this->id = isset($requestParams['id']) ? $requestParams['id'] : null;
        $this->firstName = isset($requestParams['firstName']) ? $requestParams['firstName'] : null;
        $this->lastName = isset($requestParams['lastName']) ? $requestParams['lastName'] : null;
        $this->email = isset($requestParams['emailId']) ? $requestParams['emailId'] : null;
    

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    
        //
        $user = User::firstOrNew(array('id' => $this->id));
        $user->first_name = $this->firstName;
        $user->last_name = $this->lastName;
        $user->email = $this->email;
        $user->save();
        return $user;
    

当我在控制器中打印 $user 时,我得到“0”作为输出

【问题讨论】:

【参考方案1】:

当我使用 php artisan 模块通过命令行创建作业时:make-job user

创建的文件是

class CheckJob implements ShouldQueue



由于它是实现 ShouldQueue 该函数充当 async 但是当我 删除 实现 ShouldQueue 时它会起作用作为 sync 并按预期返回 id

【讨论】:

是的,如果我没记错的话,您可以在创建作业时将 --sync 选项传递给 php artisan 以避免事后必须手动进行此更改。很高兴您设法解决了这个问题。【参考方案2】:

其中很大一部分原因在于 Laravel 中的 Jobs 具有异步的潜力,并且通常以这种方式使用。如果您打算将ShouldQueue 与您的作业一起使用,则根本不可能将值返回给您的控制器(至少在没有非常hacky 的解决方案的情况下是不可能的)。如果您正在触发作业并立即返回,即同步返回,请删除 ShouldQueue 实现。从那里开始,从作业中返回数据会更简单,请查看此答案中的建议以了解一种可能的方法:

https://***.com/a/37335658/7086017

【讨论】:

谢谢你,Sheraz,所以工作是异步函数,所以有没有一种可能的方法来进行同步,以便我可以获得返回并使用用户对象移动到控制器中的下一行;在你告诉我的链接中,我试过但仍然得到 0 作为函数响应的响应

以上是关于Laravel- Jobs - 将 0 作为结果返回给模块内的控制器的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5:如何测试调用API的Jobs?

带有内部连接的 Laravel 范围

如何从原始查询中检索结果集作为数组而不是 Laravel 3 中的对象

Laravel 6未定义变量:工作

laravel Laravel延迟队列

我如何很好地解码Laravel失败的工作JSON