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

Laravel Route - Check if ID does not exist and show 404

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

我如何在 Laravel 的 web.php 路线中检查这个?

我目前有以下路线:

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

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

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

更新说明:与 Laravel 4 方法略有不同,因为绑定似乎已融入路由 class。

你要用的叫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

添加到 Patrick Schocke 的回答中。

如果不想使用Route Model Binding,可以显式签入controller

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

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

   ...
    }
}

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

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

您可以使用 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. 
}

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

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

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