【问题标题】:Route Model Binding does not work on route group in laravel路由模型绑定不适用于 laravel 中的路由组
【发布时间】:2017-10-07 16:11:12
【问题描述】:

假设我有这些路线:

$api->group(['prefix' => 'Course'], function ($api) {
    $api->group(['prefix' => '/{course}'], function ($api) {
       $api->post('/', ['uses' => 'CourseController@course_details']);
       $api->post('Register', ['uses' => 'CourseController@course_register']);
       $api->post('Lessons', ['uses' => 'CourseController@course_lessons']);
     });
});

如您所见,所有 / 、 Register 和 Lessons 路由都以 course 必需参数为前缀。

course 参数是我想用于路由模型绑定的Course 模型的 ID。

但另一方面,当我想在course_details 函数中使用course 参数时,它会返回null。像这样:

    public function course_details (\App\Course $course)
    {
        dd($course);
    }

但如果我在下面使用,一切正常:

    public function course_details ($course)
    {
        $course =   Course::findOrFail($course);

        return $course;
    }

似乎无法正确绑定模型。

什么是问题?

更新:

事实上,我正在使用dingo-api laravel 包来创建 API。所有基于其配置定义的路由。

但是有一个关于路由模型绑定的问题,在哪里支持路由模型绑定,我们必须在每个需要模型绑定的路由中添加一个名为binding 的中间件。 HERE 是这样描述的。

存在的一个更大的问题是,当我想将binding 中间件添加到路由组时,它不起作用,我必须将它添加到每个路由中。

在这种情况下,我不知道如何解决问题。

解决方案:

经过多次谷歌搜索,我发现:

我发现必须将 bindings 中间件添加到添加了 auth.api 中间件的同一路由组中,而不是将其分别添加到每个子路由中。
意思是这样的:

$api->group(['middleware' => 'api.auth|bindings'], function ($api) {
});

【问题讨论】:

    标签: php laravel laravel-5.4


    【解决方案1】:

    仔细看:

    // Here $course is the id of the Course
    public function course_details ($course)
    {
        $course =   Course::findOrFail($course);
        return $course;
    }
    

    但是在这里:

    // Here $course is the object of the model \App\Course
    public function course_details (\App\Course $course)
    {
        dd($course);
    }
    

    应该是

    public function course_details ($course, \App\Course $_course)
    {
        // add your model here with object $_course
    
        // now $course return the id in your route
        dd($course);
    }
    

    【讨论】:

    • 为什么要添加`$_course`参数? laravel 文档说 类型提示的变量名称匹配路由段名称就足够了,Laravel 将自动注入具有与请求 URI 中的相应值匹配的 ID 的模型实例 .我不明白 $_course 是什么,必须添加它。
    【解决方案2】:

    如你所说

    课程参数是课程的ID

    你可以使用Request获取id,这样试试

    public function course_details (Request $request)
    {
        return dd($request->course);
    }
    

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题。我认为您需要在路线上使用“绑定”中间件。 在这里查看我的答案:

      https://stackoverflow.com/a/55949930/2867894

      【讨论】:

        【解决方案4】:

        添加kernel.php

         use Illuminate\Routing\Middleware\SubstituteBindings;
            protected $routeMiddleware = [
                     ...
                    'bindings' => SubstituteBindings::class,
                ];
        

        在你的团体路线中:

            Route::middleware(['auth:sanctum', 'bindings'])->group(function(){
            ... you routes here ...
            });
        

        这对我有用。谢谢

        【讨论】:

        • 是的,它有效。太感谢了。节省了我很多时间。
        猜你喜欢
        • 2015-08-28
        • 1970-01-01
        • 1970-01-01
        • 2015-07-25
        • 2021-05-24
        • 2016-06-04
        • 2018-12-17
        • 2020-10-03
        • 2017-08-06
        相关资源
        最近更新 更多