Разрешить класс ресурсов с измененным отношением - PullRequest
0 голосов
/ 05 марта 2019

Задача

У меня есть модель с трансформированным отношением, и эти разные типы отношений имеют совершенно разные ресурсы json для возврата.Поэтому я пытаюсь найти способ разрешить правильный класс отношений и вернуть его с ресурсом базовой модели.

Например, если у меня есть комментарий и трансформированное отношение «commentable», содержащее экземпляры модели Car и Driver.Теперь, если бы я попросил некоторый комментарий, я смог бы вернуть правильный ответ json, сохраненный в CarResource или PeopleResource.

{
    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
    },
}

Попытка решить

Я пытался использовать следующее, но получил ошибку.

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)

Приложение класса\ Http \ Resources \ CarResource не существует

Но если класс существует, я получаю следующую ошибку

Подсветка \ Контракты \ Контейнер \ BindingResolutionException

Разрешение неразрешимых зависимостей [Параметр # 0 [$ resource]] в классе Illuminate \ Http \ Resources \ Json \ JsonResource

Вопрос

Что вы думаете?Есть ли у вас какое-либо решение или рекомендации, например, как лучше управлять этим?

1 Ответ

0 голосов
/ 06 марта 2019

Хорошо, я нашел решение, углубившись в Laravel. Сервисный контейнер - мой друг.Например, BindingResolutionException говорит, что мне нужно дать параметру $resource для резольвера с помощью функции makeWith().

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

Однако, пожалуйста, дайте мне знать, если у кого-нибудь есть мысли по поводу улучшения этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...