【问题标题】:Controller response weird behaviour控制器响应奇怪的行为
【发布时间】:2020-03-31 12:51:17
【问题描述】:

我不明白我的 Laravel 控制器中这种 json 响应的情况

按预期工作正常:

public function getHelloV1(Request $req) {
    if ($isOK == false) {
         return response()->json([
             'success' => false,
             'msg' => 'hum...',
         ], 400);
     }

     return View::make('app.hello'); }

完全不像预期的那样工作:

private test() {
     if ($isOK == false) {
         return response()->json([
             'success' => false,
             'msg' => 'hum...',
         ], 400);
     }}

public function getHelloV2(Request $req) {
     self::test();

     return View::make('app.hello');}

对于getHelloV2,私有test()正确到达(一个简单的Log::debug()确认)但不会触发json响应

有人知道为什么吗?只是为了理解......

仅供参考:我也尝试过Response::json([...], 400);,但行为相同......

【问题讨论】:

    标签: json ajax laravel controller response


    【解决方案1】:

    在您的第二个示例中,您在私有函数中返回响应,但您没有将其存储在任何地方以显示它。

    在您的第一个示例中,您直接访问您的公共函数,以便处理和显示您的响应,但在您的第二个示例中并非如此。

    public function getHelloV2(Request $req) {
         self::test();
    
         return View::make('app.hello');
    }
    

    self:test(); 将到达您的私有函数测试,但您需要在那里发送变量。 $isOk 变量未在您的私有函数中的任何地方定义,因此您需要在您的 getHelloV2 中定义它并将其发送到类似以下的测试:

    public function getHelloV2(Request $req) {
         $isOk = false;
         self::test($isOk);
    
         return View::make('app.hello');
    }
    

    你的私有函数应该是这样的:

    private test($isOK) {
         if ($isOK == false) {
             return response()->json([
                 'success' => false,
                 'msg' => 'hum...',
             ], 400);
         }}
    

    如果此值来自请求,只需传递请求字段以检查它。

    现在在您的公共函数getHelloV2 中,您有测试的输出,您只需将其存储并显示在类似的位置:

    public function getHelloV2(Request $req) {
         $myOutput = self::test();
    
         echo $myOutput; //here is your json response
         return View::make('app.hello');
    }
    

    最好的做法是在你的 if 检查之外返回一些东西,这样你的函数总是输出一些东西。你可以只返回一个布尔值,但如果$isOk 为真,你的函数应该返回一些东西。

    【讨论】:

    • 我理解你的解释,但有一点让我有点困惑。为什么json响应的返回需要回显而不是视图的返回?如果我们将 json 响应的返回替换为 View::make() 的返回,那么它运行良好,为什么?据我了解,这也是一种回报。我只想在我的控制器中考虑一些特殊情况。不足以制作中间件,但足以分解它(我猜)
    • 或者我们甚至可以用return redirect()->route() 替换...效果很好我不明白为什么return response()->json() 不起作用:/
    • 因为重定向和响应是不同的行为。重定向将为您加载一个视图并将您发送到那里,响应只会打印一条消息,但在您的情况下,此消息是您的公共函数中调用的私有函数的输出。信息就在那里,你只是没有用它做任何事情。阅读我的答案直到最后。
    • 我已经读到最后,感谢您花时间向我解释=)问题,当然由于我的误解,也与回声有关...在你的最后一个例子中,您回显 $myOutput ,这是私有 self::test() 的返回,这也不会触发 json 响应...如前所述,我正在学习 laravel/php,我只想了解 ^^ 谢谢任何情况下您的时间
    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    相关资源
    最近更新 更多