在 Laravel 5.1 中验证 API 请求
Validating an API request in Laravel 5.1
我正在创建一个简单的 api,使用 laravel 5.1 在 table 和 return 新创建行的 ID 中创建一行。
我可以这样做,但是当涉及到验证时,我不确定该怎么做。
例如
transaction_request table
id|order_id|customer_id|amount
只需要 order_id 和 customer_id 的验证规则
我请求这个的 uri 是 http://localhost:8000/api/v1/transactionRequests?order_id=123&customer_id=&amount=3300
请注意 customer_id 未定义。用户 return 被以下 json.
编辑
{
"error": {
"code": "GEN-WRONG-ARGS",
"http_code": 400,
"message": "{\"customer_id\":[\"The customer_id field is required.\"]}"
}
}
看到消息:那些'\',我该如何解决。我知道,这是因为,我在我的控制器中使用了以下抛出异常的验证方法
public function validateRequestOrFail($request, array $rules, $messages = [], $customAttributes = [])
{
$validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);
if ($validator->fails())
{
throw new Exception($validator->messages());
}
}
我用catch处理如下
try {
if(sizeof(TransactionRequest::$rules) > 0)
$this->validateRequestOrFail($request, TransactionRequest::$rules);
} catch (Exception $e) {
return $this->response->errorWrongArgs($e->getMessage());
}
errorWrongArgs 定义如下
public function errorWrongArgs($message = 'Wrong Arguments')
{
return $this->setStatusCode(400)->withError($message, self::CODE_WRONG_ARGS);
}
public function withError($message, $errorCode)
{
return $this->withArray([
'error' => [
'code' => $errorCode,
'http_code' => $this->statusCode,
'message' => $message
]
]);
}
我希望响应如下所示(顺便说一下,我使用的是 ellipsesynergie/api-response 库而不是默认响应 class,因为我使用的是 chrisbjr/api-guard)
{
"error": {
"code": "GEN-WRONG-ARGS",
"http_code": 400,
"message": {
"customer_id": "The customer_id field is required."
}
}
}
是的,问题在于我对 $validator->messages()
returns 的理解,它 returns 一个 MessageBag
对象更像是一个 Json 对象. Exception()
需要字符串消息。因此它通过将引号字符转义为 \" 将 Json 视为字符串。解决方案是我将 Json 字符串传递给 Exception 方法,但在我捕获它之后我转换 Json 字符串使用 json_decode 到数组,然后由我的响应 class.
获取
throw new Exception($validator->messages());
return $this->response->errorWrongArgs(json_decode($e->getMessage(),true));
我正在创建一个简单的 api,使用 laravel 5.1 在 table 和 return 新创建行的 ID 中创建一行。
我可以这样做,但是当涉及到验证时,我不确定该怎么做。
例如
transaction_request table
id|order_id|customer_id|amount
只需要 order_id 和 customer_id 的验证规则
我请求这个的 uri 是 http://localhost:8000/api/v1/transactionRequests?order_id=123&customer_id=&amount=3300
请注意 customer_id 未定义。用户 return 被以下 json.
编辑{
"error": {
"code": "GEN-WRONG-ARGS",
"http_code": 400,
"message": "{\"customer_id\":[\"The customer_id field is required.\"]}"
}
}
看到消息:那些'\',我该如何解决。我知道,这是因为,我在我的控制器中使用了以下抛出异常的验证方法
public function validateRequestOrFail($request, array $rules, $messages = [], $customAttributes = [])
{
$validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);
if ($validator->fails())
{
throw new Exception($validator->messages());
}
}
我用catch处理如下
try {
if(sizeof(TransactionRequest::$rules) > 0)
$this->validateRequestOrFail($request, TransactionRequest::$rules);
} catch (Exception $e) {
return $this->response->errorWrongArgs($e->getMessage());
}
errorWrongArgs 定义如下
public function errorWrongArgs($message = 'Wrong Arguments')
{
return $this->setStatusCode(400)->withError($message, self::CODE_WRONG_ARGS);
}
public function withError($message, $errorCode)
{
return $this->withArray([
'error' => [
'code' => $errorCode,
'http_code' => $this->statusCode,
'message' => $message
]
]);
}
我希望响应如下所示(顺便说一下,我使用的是 ellipsesynergie/api-response 库而不是默认响应 class,因为我使用的是 chrisbjr/api-guard)
{
"error": {
"code": "GEN-WRONG-ARGS",
"http_code": 400,
"message": {
"customer_id": "The customer_id field is required."
}
}
}
是的,问题在于我对 $validator->messages()
returns 的理解,它 returns 一个 MessageBag
对象更像是一个 Json 对象. Exception()
需要字符串消息。因此它通过将引号字符转义为 \" 将 Json 视为字符串。解决方案是我将 Json 字符串传递给 Exception 方法,但在我捕获它之后我转换 Json 字符串使用 json_decode 到数组,然后由我的响应 class.
throw new Exception($validator->messages());
return $this->response->errorWrongArgs(json_decode($e->getMessage(),true));