【问题标题】:Route model binding and parent child validation in LaravelLaravel 中的路由模型绑定和父子验证
【发布时间】:2016-05-10 00:49:01
【问题描述】:

假设我有这样的路线:

Route::get('users/{user}/posts/{post}', 'PostController@show')

我已经为App\User{user}App\Post{post} 设置了路由模型绑定。我已经看到我可以为任何给定的用户调用任何现有的帖子来获取屏幕上的内容。是否有一个通用的地方可以为绑定模型分配约束?

【问题讨论】:

  • 在控制器中怎么样?
  • 我知道可以在那里完成,但我想知道 Taylor 是否在其他地方为类似的东西创造了一个隐藏的小宝石。
  • 如果你使用 Laravel 5+,有一个文件:app\Providers\RouteServiceProvider.php。放在map 方法中。正如@noodles_ftw 建议的那样,但将first 更改为firstOrFail。我相信,如果你先绑定用户,它会显示一个错误是没有这样的用户。

标签: php laravel routes model-binding


【解决方案1】:

您可以使用Route::bind 并为该函数设置第二个变量以访问当前路由及其参数,如下所示:

class RouteServiceProvider extends ServiceProvider{
    public function boot(Router $router)
    {
        $router->bind('user', function($value) {
            return App\User::findOrFail($value);
        });

        $router->bind('post', function($value, $route) {
            return $route->parameter('user')->posts()->findOrFail($value);
        });
    }
}

【讨论】:

    【解决方案2】:

    您可以使用$router->bind() 来控制模型的获取方式:

    Route::get('/user/{name}', 'PostController@show');

    $router->bind('user', function($value) {
        return App\User::where('name', $value)->first();
    });
    

    【讨论】:

    • 我从来没有想过在函数中实现它,我总是把模型的名字放在那里。谢谢
    【解决方案3】:

    这肯定是 laravel 的一个缺口。我做了一个小包来帮忙。 https://github.com/tarekadam/laravel-orm-binding-validation

    1. 使用中间件而不是验证。
    2. 附加中间件,以便绑定已经运行。
    3. 在控制器中定义预期的关系。

    请参阅包上的 README.md。

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 2016-06-04
      • 2018-12-17
      • 2016-04-20
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多