【问题标题】:Laravel Route - Check if ID does not exist and show 404Laravel Route - 检查 ID 是否不存在并显示 404
【发布时间】:2019-11-10 05:55:43
【问题描述】:

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

如何在 Laravel 的 web.php 路由中检查这一点?

我目前有以下路线:

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

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

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

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

【问题讨论】:

    标签: laravel laravel-routing


    【解决方案1】:

    您要使用的称为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

    【讨论】:

    • 这很棒。这意味着我也可以通过不使用 Request $request 来清理控制器中的代码,而直接使用 Project 模型。感谢您的帮助!
    【解决方案2】:

    补充帕特里克·肖克的答案。

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

    public function public($project_id) {
        $projectExists = Project::where('id', $project_id)->exists();
    
        abort_unless($projectExists, 404, 'Project not found');
    
       ...
        }
    }
    

    【讨论】:

    • 作为替代方案,您也可以使用 Laravel abort 辅助函数 abort(404, 'Project not found') 来消除构建和返回响应的需要。或者还要删除条件语句,您甚至可以使用abort_unless($projectExists, 404, 'Project not found')。您可以在Laravel Documentation 中了解更多信息。
    • @Bogdan 哇。非常感谢您提供这些提示。我不知道这些 Laravel 辅助函数。
    • 另一种选择(假设id 是模型的主键)是使用findOrFail()。例如。 Project::findOrFail($project_id)。如果找不到该项目,这会自动返回 404。
    【解决方案3】:

    只需使用 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】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2019-09-02
          • 2021-08-08
          • 1970-01-01
          • 1970-01-01
          • 2021-09-24
          • 1970-01-01
          • 2014-10-02
          • 1970-01-01
          • 2014-05-24
          相关资源
          最近更新 更多