【问题标题】:Polymorphic Route Model Binding in Laravel?Laravel中的多态路由模型绑定?
【发布时间】:2018-06-17 18:05:30
【问题描述】:

有什么方法可以在 laravel 5.* 上创建隐式绑定的类多态模型??

例如:

route('project.comment.store', $project->commentable)

像这样注册路由

Route::get('comments/{commentable}/store', ....controller . '@store')

并在控制器的 store() 方法中接收到确切的模型?

我猜我可以存档的唯一方法是如果我将路线修改为这样的东西

Route::get('comments/{commentable_type}/{commentable_id}/store', ....controller . '@store')

这看起来很丑……但是很有效……知道是否有任何更短更聪明的方法吗?

【问题讨论】:

  • 为什么不通过 POST 将对象的 id 发送给方法,然后使用 Comments::find($id) 获取对象?
  • 我的代码中有一个问题...如果我确实发送了 $project->id 的 id 而不是 $project->commentable->id 并且它会在我检索时工作$project->find($id)->commentable->cmets->create()..... 问题是 $project->commentable 可能会不时更改为另一个可评论对象的实例。因此 ->commentable 现在引用的对象在通过 post 方法到达控制器时可能不是同一个对象
  • 拉斐尔最后做了什么?
  • 这是一个非常难的问题......我确实设法让这个工作,但我没有更多关于我需要这个项目的记忆......
  • 相关:[[5.6] 允许可空方法注入(多态路由模型绑定) by mpyw · Pull Request #22488 · laravel/framework](github.com/laravel/framework/pull/22488)

标签: laravel-5


【解决方案1】:

对不起,我迟到了。您可以像这样绑定多态路由模型:

  1. 将 Route::bind() 添加到 RouteServiceProvider 或您的包 ServiceProvider。您的自定义模型解析逻辑将在那里。

  2. 注入一个普通的旧 \Illuminate\Database\Eloquent\Model 而不是任何特定的。 (或您扩展的任何基本模型)。

这是我现有代码中的一个示例...我的绑定在 /my-model/{key}/seo 上。在绑定期间,我从 my-model 自定义解析 MyModel,然后使用 {key} 作为 id。

//我的包路由文件

Route::group(['as' => 'fuqu::', 'namespace' => 'FuquIo\\LaravelTags', 'middleware' => ['web', 'auth']], function (){

$models = config(\FuquIo\LaravelTags\ServiceProvider::SHORT_NAME .'.orm');

foreach($models as $short_name => $fqns_class){
    $kebbab_name= kebab_case($short_name);

    Route::get("/$kebbab_name/{key}/seo", [
        'as'   => "$kebbab_name.seo",
        'uses' => function(\Illuminate\Database\Eloquent\Model $model){
        return $model;
    }
    ]);
}

});

// 我在 boot() 中的包 ServiceProvider.php(或您的 RouteServiceProvider.php),但您需要 use Illuminate\Routing\Route as RouteInfo; 进行我在绑定中进行的注入。

// at the top
use Illuminate\Routing\Route as RouteInfo;
...
// then inject RouteInfo for your binding logic so you can tear apart your url/uri.
Route::bind('key', function ($key, RouteInfo $route) {
        $info = explode('/{key}', $route->uri());
        $kebab = $info[0];
        $orm = studly_case($kebab);
        $fqns_class = config(self::SHORT_NAME .'.orm.'. $orm);
        return $fqns_class::findOrFail($key);
    });

所以,在我的例子中,我有一个配置文件映射 SimpleNames => Fully\NameSpaced\Names::class,但你不需要它。你可以随心所欲地解决。

【讨论】:

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