创建时的Laravel模型错误处理

时间:2016-03-26 23:05:15

标签: php laravel

我想使用Eloquent创建一个这样的数据库条目:

   MFUser::create(array(
        'user_reference' => $this->userReference,
        'first_name' => $this->firstName,
        'last_name' => $this->lastName,
        'user_type_id' => $this->userTypeId,
        'email' => $this->email,
        'password' => $this->password
    ));

除了这种情况之外,它的效果很好,当完全相同的数据放入字段时,这是预期的,因为应该没有重复。然后我得到QueryExecption。

但是如何在此处正确执行错误处理以检查是否发生此查询异常,以便我可以通过json将响应从我的服务器返回给客户端呢?

4 个答案:

答案 0 :(得分:3)

将该代码包装在try - catch块中。像这样:

try {
    MFUser::create(array(
        'user_reference' => $this->userReference,
        'first_name' => $this->firstName,
        'last_name' => $this->lastName,
        'user_type_id' => $this->userTypeId,
        'email' => $this->email,
        'password' => $this->password
    ));
} catch (\Illuminate\Database\QueryException $exception) {
    // You can check get the details of the error using `errorInfo`:
    $errorInfo = $exception->errorInfo;

    // Return the response to the client..
}

答案 1 :(得分:3)

我更愿意保留try/catch以查找无法在其他地方处理的意外事件。在这种情况下,您可以将验证用作第一个度量,将异常处理程序用作备份度量。

如果表单请求失败,则会闪烁错误消息,并且用户将返回上一页(提交表单的位置),您可以正常处理消息。 Validation requests

// First line of defence - gracefully handle
// Controller 
public function store(MFUserRequest $request)
{
    // The incoming request is valid...
    MFUser::create(array(...));
}

// Form Request
class MFUserRequest extends Request 
{
    public function rules()
    {
        return [
            'email' => 'required|email|unique:users,email',
        ];
    }    
}

在其他地方,在您的App \ Exceptions目录中,您有一个异常处理程序类,可以捕获所有错误。如果您无法优雅地进一步处理它,请使用此功能。

// Second line of defence - something was missed, and a model was  
// created without going via the above form request
namespace App\Exceptions;

class Handler extends ExceptionHandler
{
    public function render($request, Exception $e)
    {        
        if($e instanceof QueryException) {
            // log it or similar. then dump them back on the dashboard or general something bad
            // has happened screen
            return redirect()->route('/dashboard');
        }
    }
}

答案 2 :(得分:1)

Try and Catch可能会对您有所帮助,并为所有对象设想创建try try,但是有处理所有QueryException的最佳实践,我建议您使用Laravel Exceptions Handler,因为它使u易于全局执行!

尝试一下!,打开App\Exception\Handler.php,然后在渲染方法中,您可以像这样写

public function render($request, Throwable $exception)
{
   if ($request->ajax() || $request->wantsJson()) {
      if ($exception instanceof QueryException) {
          // example algo for make response
          return response()->json(['message' => 'xxx'], 403);
      }
   }

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

之后,对于查询触发的每个错误请求,您都可以获取xxx json

答案 3 :(得分:0)

只需使用try / catch块即可。

use Illuminate\Database\QueryException;

// ...

try {
    // DB query goes here.
} catch (QueryException $e) {
    // Logics in case there are QueryException goes here
}

// ...