是否有任何方法可以创建一个隐式绑定在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')
这看起来很丑陋..但是有效...任何想法是否有任何简短而明智的方式这样做?
答案 0 :(得分:0)
对不起,我迟到了。你可以像这样对多态路由模型绑定:
将Route :: bind()添加到RouteServiceProvider或您的包ServiceProvider。您的自定义模型分辨率逻辑将会到达那里。
注入一个普通的\ 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;
}
]);
}
});
//我的程序包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,但你不需要它。你可以随意解决。