使用变形关系解析资源类

时间:2019-03-05 17:35:24

标签: php laravel eloquent

问题

我的模型具有变型关系,那些不同类型的关系具有完全不同的json资源可返回。因此,我试图寻找一种解决正确的关系类并随基础模型资源一起返回的方法。

例如,如果我有Comment和包含Car和Driver模型实例的变形关系“ commentable”。现在,如果我要发表评论,我将能够返回存储在CarResource或PeopleResource中的正确json响应。

{
    id: 1,
    text: 'A comment',
    commentable_type: 'Car', // could be car or driver
    commentable_data: {
        model: 'Ford',
        year: 2019
    },

    id: 2,
    text: 'An another comment',
    commentable_type: 'Driver',
    commentable_data: {
        name: 'Jon Doe',
        active: true
    },
}

试图解决

我尝试使用following,但出现错误。

public function toArray($request)
{
    $modelClass = app(__NAMESPACE__ . '\\' . class_basename($this->commentable) . 'Resource');

    return [
        'id' => $this->id,
        'text' => $this->text,
        'commentable_type' => class_basename($this->commentable),
        'commentable_data' => new $modelClass($this->commentable),
    ];
}

如果解决的课程不存在,我当然会得到

  

ReflectionException(-1)

     

App \ Http \ Resources \ CarResource类不存在

但是如果该类存在,则会出现以下错误

  

照亮\合同\容器\ BindingResolutionException

     

无法解析的依赖项解析[参数#0 [$ resource   ]]在类Illuminate \ Http \ Resources \ Json \ JsonResource

问题

您怎么看?您是否有任何解决方案或建议,例如如何更好地管理呢?

1 个答案:

答案 0 :(得分:0)

好吧,我通过更深入地研究Laravel找到了解决方案。 Service Container是我的朋友。就像 BindingResolutionException 所说,我需要使用$resource函数将makeWith()参数赋予解析器。

$modelClass = app()->makeWith(__NAMESPACE__ . '\\' . class_basename($this->barcodable) . 'Resource', [
    'resource' => $this->barcodable
]);

但是,如果有人对此有任何想法,请告诉我。