Laravel:控制器对ajax请求的正确响应是什么?

时间:2017-06-15 05:10:06

标签: ajax laravel

我在回复对我所做的ajax请求的正确回复时遇到了问题。

基本上,我有一个checkboxchanged()触发csrf-token的ajax被POST method接受时,数据库上反映的更改成功但错误开始返回"状态"对ajax的过程。

继承我的控制器方法:

public function update(Request $request, $id)
  {
      $result = ItemPrice::toggleRestockable($id);

      return $result;
  }

$resultDB::update() method

的输出

无论查询是否成功,ajax都会error:阻止Internal Server Error 500阻止。

ajax中responseText变量的data主要是:

(1/1) UnexpectedValueException
The Response content must be a string or object implementing __toString(), "boolean" given.

现在我知道我正在返回boolean或技术上是一个整数,因为它是DB::update()的结果,它返回受update影响的行数。

现在我怎样才能正确返回ajax可以理解的响应?

5 个答案:

答案 0 :(得分:3)

试试这个

public function update(Request $request, $id)
{
  $result = ItemPrice::toggleRestockable($id);
  return Response::json(['success' => $result], 200);
}

答案 1 :(得分:3)

创建一个基本ApiController抽象类并在任何控制器中扩展它。所以你不需要为每个函数和每个控制器的成功和错误准备响应obj。你只需要调用函数。这里给出的例子。

// Base ApiController

 abstract class ApiController extends Controller
    {

        /**
         * Make standard response with some data
         *
         * @param object|array $data Data to be send as JSON
         * @param int $code optional HTTP response code, default to 200
         * @return \Illuminate\Http\JsonResponse
         */
        protected function respondWithData($data, $code = 200)
        {
            return Response::json([
                'success' => true,
                'data' => $data
            ], $code);
        }


        /**
         * Make standard successful response ['success' => true, 'message' => $message]
         *
         * @param string $message Success message
         * @param int $code HTTP response code, default to 200
         * @return \Illuminate\Http\JsonResponse
         */
        protected function respondSuccess($message = 'Done!', $code = 200)
        {
            return Response::json([
                'success' => true,
                'message' => $message
            ], $code);
        }

        /**
         * Make standard response with error ['success' => false, 'message' => $message]
         *
         * @param string $message Error message
         * @param int $code HTTP response code, default to 500
         * @return \Illuminate\Http\JsonResponse
         */
        protected function respondWithError($message = 'Server error', $code = 500)
        {
            return Response::json([
                'success' => false,
                'message' => $message
            ], $code);
        }

如何使用基类的功能。见这里的例子

public function update(Request $request, $id)
  {
    try{
      $result = ItemPrice::toggleRestockable($id);
    return $this->respondWithData($result);
      }catch(Exception $e){
      return $this->respondWithError($e->getMessage());
    }
  }

如何将基本控制器扩展到您的控制器

class TestController extends ApiController {}

答案 2 :(得分:2)

JsonResponse是你需要的课程。

return response()->json($result);

使用助手。如果处理集合,请在$ result上使用 - > toArray()。

答案 3 :(得分:1)

return $result;

将返回数据对象,有多种方法可以处理此问题,具体取决于切换函数的返回类型。

处理AJAX请求的典型方法是保存数据并返回状态和消息。

在您的方案中,我可以使用对JSON的响应

 public function update(Request $request, $id)
    {
        $status  = 500;
        $message = 'An Un expected error Occured';
        try {
            $result = ItemPrice::toggleRestockable($id);
            //assuming toggleRestockable function will return  bool
            if ($result) {
                $status  = 200;
                $message = 'Successfully Updated';
            }
            return response()->json(['status' => $status, 'message' => $message]);

        } catch (Exception $e) {
            return response()->json(['status' => 500, 'message' => $e->getMessage()]);
        }
    }

这种做法对我来说很好

答案 4 :(得分:0)

    public function update(Request $request, $id)
      {
        $this->validate($request, [
       //some of your data =>'required|min:4'; <-your rules
                       ]);
          $result = ItemPrice::findOrFail($id);
          //something request;
          $result->save();

          return response()->json(['result'=>$result]);
      }


and you can call your error by using this
@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif


i hope it will helps you a lot :)