Laravel中的多态路线模型绑定?

时间:2016-07-20 06:37:06

标签: laravel-5

是否有任何方法可以创建一个隐式绑定在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')

这看起来很丑陋..但是有效...任何想法是否有任何简短而明智的方式这样做?

1 个答案:

答案 0 :(得分:0)

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

  1. 将Route :: bind()添加到RouteServiceProvider或您的包ServiceProvider。您的自定义模型分辨率逻辑将会到达那里。

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

  3. 这是我现有代码中的一个示例...我的绑定在/ 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;
        }
        ]);
    }
    
    });
    

    //我的程序包ServiceProvider.php(或你的RouteServiceProvider.php)在boot()中,但你需要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 =>完全\ NameSpaced \ Names :: class,但你不需要它。你可以随意解决。