【问题标题】:Laravel 5. Exceptions Handler / unique database fieldLaravel 5. 异常处理程序/唯一数据库字段
【发布时间】:2016-02-13 16:41:03
【问题描述】:

我想避免以下错误:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry

当我尝试添加数据库中已存在的电子邮件时,这会显示在我的屏幕上。所以我想用视图中显示的自定义错误消息替换这个错误屏幕。

这是我尝试过的:

//inside app/Exceptions/Handler.php

public function render($request, Exception $e)
{  
    if ($e instanceof ModelNotFoundException) {
        $e = new NotFoundHttpException($e->getMessage(), $e);
    }                

    if ($e instanceof Illuminate\Database\QueryException){
        if($e->errorInfo[1] == 1062){
            // But It never reaches this point
        }
    }

    return parent::render($request, $e);
}

错误码确实是1062,但问题是没有通过这个:

if ($e instanceof Illuminate\Database\QueryException)

你知道为什么,或者我做错了什么吗?

【问题讨论】:

  • 如果你发现catch (Illuminate\Database\QueryException $e) 并检查$errorCode = $e->errorInfo[1]; 会发生什么?
  • 嗯,我想在渲染函数中保持顺序。保持所有 if 相同。
  • 好的,但是你不能使用这个? catch (Illuminate\Database\QueryException $e) ,然后是 if($e->errorInfo[1] == 1062){ //it might reach here }
  • 具体catch (Illuminate\Database\QueryException $e){ if($e->errorInfo[1] == 1062){ // throw here } } 。这对你有用吗?
  • 你也不想做validatoin ?

标签: php laravel exception laravel-4 laravel-5


【解决方案1】:

问题参考代码中的命名空间似乎格式错误。

而不是 Illuminate\Database\QueryException

应该是 \Illuminate\Database\QueryException

【讨论】:

    【解决方案2】:

    您正在寻找23000 Error code (integrity_constraint_violation)。如果您看一下 [QueryException][1] 类,它从 [PDOException][2] 扩展而来,因此您可以访问 $errorInfo 变量。

    要捕获此错误,您可以尝试:

    try {
      // ...
    
    } catch ( \Illuminate\Database\QueryException $e) {
        var_dump($e->errorInfo );
    }
    
    // example output 
    array (size=3)
       0 => string '23000' (length=5)
       1 => int 1452
       2 => string 'Cannot add or update a child row: a foreign key constraint fails (...)'
    

    【讨论】:

      【解决方案3】:

      如果没有任何效果,最糟糕的答案是从 db 中的“电子邮件”字段中删除唯一键。

      但我认为您需要的是验证,您也可以为每个字段设置自定义错误消息。

      参考:http://laravel.com/docs/5.0/validation#custom-error-messages

      控制器文件

      public function store(Request $request)
      {
          $v = Validator::make($request->all(), [
                  'name' => 'required|min:5',
                  'email' => 'required|email|unique:users,email',
                  'password' => 'required|min:6',
                  'confirm_password' => 'required|min:6|same:password'
              ]);
      
          if ($v->fails())
          {
              return redirect()->back()->withErrors($v->errors());
          }
      
          //do success actions here
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        • 2015-09-03
        • 2016-08-03
        相关资源
        最近更新 更多