自定义"未找到" Laravel的路由"显式绑定"

时间:2016-07-23 20:29:13

标签: php laravel binding model routes

以下是文档:https://laravel.com/docs/5.2/routing#route-model-binding

路线:

Route::group(['prefix' => 'u'], function () {
    Route::post('create', ['as' => 'createUser', 'uses' => 'UserController@create']);
    Route::get('{uuid}', ['as' => 'userDashboard', 'uses' => 'UserController@dashboard']);
});

UserController.php:

public function dashboard(User $uuid)
{
    return View::make('user.dashboard');
}

每当在数据库中找不到用户时,它会抛出以下两个例外:

2/2
NotFoundHttpException in Handler.php line 103:
No query results for model [App\User].

1/2
ModelNotFoundException in Builder.php line 303:
No query results for model [App\User].

如何自定义错误?我想重定向到createUser路线。文档指示传递Closure作为第三个参数,但我不知道如何使用我当前的代码。

编辑1

这是我迄今为止没有成功的尝试:

   Route::model('{uuid}', ['as' => 'userDashboard', 'uses' => 'UserController@dashboard'], function () {
        App::abort(403, 'Test.');
    });

   Route::get('{uuid}', ['as' => 'userDashboard', 'uses' => 'UserController@dashboard'], function () {
        App::abort(403, 'Test.');
    });

5 个答案:

答案 0 :(得分:2)

这实际上非常简单。由于没有一个答案确实给出了明确的答案,我自己也在回答。

在文件RouteServiceController.php' boot功能中添加以下内容:

    $router->model('advertiser', 'App\Advertiser', function () {
        throw new AdvertiserNotFoundException;
    });

然后在App\Exceptions中创建一个新的空类(在本例中为AdvertiserNotFoundException.php}:

<?php

namespace App\Exceptions;

use Exception;

class AdvertiserNotFoundException extends Exception
{

}

最后要做的是在Handler.php render函数(App\Exception)中捕获异常,如下所示:

public function render($request, Exception $e)
{
    switch ($e)
    {
        case ($e instanceof AdvertiserNotFoundException):
            //Implement your behavior here (redirect, etc...)
    }
    return parent::render($request, $e);
}

那就是它! :)

答案 1 :(得分:1)

对于我所做的类似案例, 我使用了父Illuminate\Foundation\Exceptions\Handler isHttpException函数并将其复制到app/Exceptions/Handler.php并将其名称更改为isUserNotFoundException

protected function isUserNotFoundException(Exception $e)
{
    return $e instanceof UserNotFoundException;
}

并且比渲染功能添加

  if ($this->isUserNotFoundException($e))
       return redirect('path')->with('error',"Your error message goes here");

以下代码必须放在RouteServiceProvider :: boot方法

$router->model('uuid', 'App\User', function () {
throw new UserNotFoundException;

});

并确保将其包含在您的视图文件中

此论坛帖子可能会帮助您

https://scotch.io/tutorials/creating-a-laravel-404-page-using-custom-exception-handlers

答案 2 :(得分:0)

为此,您需要检查模型中是否存在ID,如下所示:

public function dashboard(User $uuid)
{
    if(User::find($uuid))
    {
        return View::make('user.dashboard');
    } else {
        redirect('xyz');
    }
}

答案 3 :(得分:0)

您可以添加例外并在app/Exceptions/Handler.php

中处理
/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $e
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $e)
{
    if (!env('APP_DEBUG')) {      
        if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
            //treat error
            return response()->view('errors.404');
    }

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

编辑1: 这段代码来自一个工作项目,所以如果这不起作用,它必须在其他地方出错:

if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
    $data= \App\Data::orderBy('order', 'asc')->get();                              
    return response()->view('errors.404', [
        'data' => $data                  
    ], 404);
}

编辑2: 您可以使用上面的代码和this tutorial来创建新的Exception类型,以便获得所需的行为。至少对我的理解。 :)

答案 4 :(得分:0)

我认为本教程对您有用[{3}}