【问题标题】:Different error message if I include an exception in Request rules如果我在请求规则中包含异常,则会出现不同的错误消息
【发布时间】:2017-03-03 20:23:37
【问题描述】:

我的模型有以下更新功能:

public function update(PartnerRequest $request, $id)
{
    $partner = Partner::findOrFail($id);

    if(!$partner -> update($request->all())) {
        throw new HttpException(500);
    }

    return response()->json([
            'status' => 'ok'
        ], 201);

}

这是请求文件:

namespace App\Api\V1\Requests;

use Config;
use Dingo\Api\Http\FormRequest;

class PartnerRequest extends FormRequest
{
    public function rules()
    {
        return [
               'name' => 'required|unique:partners,' . $this->id . ',id',
               'email' => 'email'    
        ];
    }

    public function authorize()
    {
        return true;
    }
}

如果我删除规则中的异常并将其设为'name' => 'required|unique:partners',则在重复输入的情况下我会收到以下错误消息:

{
  "error": {
    "message": "422 Unprocessable Entity",
    "errors": {
      "name": [
        "The name has already been taken."
      ]
    },
    "status_code": 422
  }
}

但问题出在补丁上,我无法更新模型(由于唯一名称规则)。所以,我需要例外。但是,如果我包含它,而不是上面的特定错误,我有一个像这样的通用错误:

  "error": {
    "message": "SQLSTATE[23000]: Integrity constraint violation: 19 UNIQUE constraint failed: partners.name (SQL: update \"partners\" set \"name\" = test, \"updated_at\" = 2017-03-03 10:47:53 where \"id\" = 3)",
    "code": "23000",
    "status_code": 500
  }
}

路线:

$api->post('partner/store', 'App\\Api\\V1\\Controllers\\PartnerController@store');
$api->get('partner/all', 'App\\Api\\V1\\Controllers\\PartnerController@index');
$api->get('partner/{id}', 'App\\Api\\V1\\Controllers\\PartnerController@show');
$api->patch('partner/{id}', 'App\\Api\\V1\\Controllers\\PartnerController@update');

【问题讨论】:

  • 您将验证规则放在Config 中的主要原因是什么?
  • 使用 Laravel API 的启动器,就像使用它一样。 github.com/francescomalatesta/laravel-api-boilerplate-jwt 但是,我也尝试将规则复制粘贴到文件中,但我仍然有相同的行为。
  • 你能为此显示Route吗?
  • @RossWilson 直接在表单请求而不是配置上更新了路由和规则

标签: laravel laravel-5.3 dingo-api


【解决方案1】:

您可以尝试执行以下操作:

public function rules()
{
    switch ($this->method()) {
        case 'POST':
            return [
                'name' => 'required|unique:partners',
                'email' => 'email'
            ];
        case 'PUT':
        case 'PATCH':

        return [
            'name' => 'required|unique:partners,name,' . $this->route('id') . ',id',
            'email' => 'email'
        ];
    }
}

希望这会有所帮助!

【讨论】:

  • 在这种情况下,我在 store 方法中有正确的消息错误,但如果更新有另一个已使用的名称,它会出现一般错误:(
  • @Tasos 我更新了我的答案。您的原始逻辑存在问题,因为您没有在忽略逻辑之前传递列名。
  • 它现在可以工作,但我必须将 route('id). ',id' 更改为 route('name').',name'
  • @Tasos 够公平的。我假设id,因为您在上面发布的路线说'partner/{id}'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2022-10-12
  • 2015-09-14
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多