Laravel路线-检查ID是否不存在并显示404

时间:2019-06-28 09:13:32

标签: laravel laravel-routing

如果ID不存在,我不想显示页面。

如何在Laravel的web.php路由中进行检查?

我目前有以下路线:

Route::get('/public/{project_id}', 'ProjectController@public');

如何进行条件检查以查看project_id是否存在?

我看到路由文档中有一个Route::bind的选项-这是一个解决方案吗?谢谢

更新说明:由于绑定似乎已经引入到路由类中,因此与Laravel 4方法略有不同。

5 个答案:

答案 0 :(得分:5)

您要使用的称为Route Model Binding。 Laravel开箱即用。如果该ID不在数据库中,则显示404页。但是,您需要更改路线:

假设您的模型称为Project,则路线应如下所示:

Route::get('/public/{project}', 'ProjectController@public');

您的ProjectController应该如下所示:

public function public(Project $project) {

这样,Laravel会使用您提供的ID自动解析项目,并将其注入$project变量中。如果不存在具有ID的记录,则laravel重定向到404

答案 1 :(得分:2)

添加到Patrick Schocke的答案中。

如果您不想使用路由模型绑定,则可以显式签入控制器

public function public($project_id) {
    $projectExists = Project::where('id', $project_id)->exists();

    abort_unless($projectExists, 404, 'Project not found');

   ...
    }
}

答案 2 :(得分:1)

您可以使用laravel路由模型绑定功能来实现

您的路线将是

Route::get('/public/{project}', 'ProjectController@public');

您的控制器将是

public function public(Project $project) {
       // Do your work here using $project model
       //  If a matching model instance is not found in the database, a 404 HTTP response will automatically be generated. 
}

答案 3 :(得分:1)

只需使用laravel的findOrFail()方法。 此方法将检索查询的第一个结果;但是,如果未找到结果,则会自动发送404 HTTP响应。

public function public ($project_id) {
    $project = Project::findOrFail($project_id);
}

源:https://laravel.com/docs/5.8/eloquent#retrieving-single-models

答案 4 :(得分:0)

您可以检查project_id是否不存在,然后通过调用404函数返回abort()错误。

  public function public($project_id) {
        $project_id_exist = Project::where('id', $project_id)->first();
        if(!$project_id_exist){
            return abort(404);
        }
    }