Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 5 Laravel中的多态路径模型绑定?_Laravel 5 - Fatal编程技术网

Laravel 5 Laravel中的多态路径模型绑定?

Laravel 5 Laravel中的多态路径模型绑定?,laravel-5,Laravel 5,有没有办法在laravel 5上创建一个隐式绑定的多态模型。* 例如: 路由('project.comment.store',$project->commentable) 像这样登记路线 路由::get('comments/{commentable}/store',..控制器'@store') 并在controller store()方法上接收精确的模型 我猜我能存档的唯一方法就是修改路由到类似这样的东西 路由::get('comments/{commentable\u type}/{

有没有办法在laravel 5上创建一个隐式绑定的多态模型。*

例如:


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

像这样登记路线


路由::get('comments/{commentable}/store',..控制器'@store')

并在controller store()方法上接收精确的模型

我猜我能存档的唯一方法就是修改路由到类似这样的东西


路由::get('comments/{commentable\u type}/{commentable\u id}/store',..controller.@store')


看起来很难看。。但是工作。。。你知道有没有更简单更聪明的方法吗?

对不起,我迟到了。您可以按如下方式绑定多态路由模型:

  • 将Route::bind()添加到RouteServiceProvider或您的packages ServiceProvider。您的自定义模型解析逻辑将转到那里

  • 注入一个普通的旧\illumb\Database\elount\Model,而不是任何特定的模型。(或从中扩展的任何基础模型)

  • 下面是我现有代码中的一个示例。。。我的绑定在/My model/{key}/seo上。在绑定期间,我从我的模型自定义解析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()中的my package ServiceProvider.php(或您的RouteServiceProvider.php),但您需要
    使用light\Routing\Route作为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,但您不需要它。您可以随意解决。

    为什么不通过POST将对象的id发送到该方法,然后使用Comments::find($id)获取该对象?我的代码中有一个问题……如果我发送的id是$project->id而不是$project->commentable->id,那么当我检索$project->find($id)时它就会起作用->可注释->注释->创建()。。。。。问题是$project->commentable可能会不时更改为另一个可注释对象的实例。。所以->commentable现在引用的对象在post Method上到达控制器时可能不是同一个对象,你最终做了什么Rafael?这是一个很难回答的问题。。。。我确实成功地让它工作了,但我没有更多的关于我所需要的项目的记忆……相关:[[5.6]允许mpyw·Pull Request#22488·laravel/framework]的可空方法注入(多态路由模型绑定)()