У меня возникли проблемы с реализацией фрактала. Я пытаюсь включить сообщения с конкретным пользователем.
Все идет хорошо, когда я добавляю сообщения $ defaultIncludes в верхней части моего UserItemTransformer. Сообщения включены, как и ожидалось.
Тем не менее, сообщения НЕ включаются в мой вывод json, когда я изменяю $ defaultIncludes на $ availableIncludes, даже после звонка $fractal->parseIncludes('posts');
Проблема заключается в том, что метод, который включает в себя сообщения, вызывается только тогда, когда я использую $ defaultInclude. он никогда не вызывается, когда я использую $ availableInclude.
Я, наверное, здесь упускаю что-то очевидное. Можете ли вы помочь мне узнать, что это такое?
Это работает:
// [...] Class UserItemTransformer
protected $defaultIncludes = [
'posts'
];
Это делает не Работа:
// [...] Class UserItemTransformer
protected $availableIncludes = [
'posts'
];
// [...] Class PostsController
// $fractal is injected in the method (Laravel 5 style)
$fractal->parseIncludes('posts');
Понял!
Когда я вызывал parseInclude (‘posts’), это было на новом экземпляре Fractal, внедренном в метод контроллера. Конечно, я должен был вызвать parseInclude () для экземпляра Fractal, который выполнял фактический анализ (и который я вставил где-то еще, в класс Api).
public function postsWithUser($user_id, Manager $fractal, UserRepositoryInterface $userRepository)
{
$api = new \App\Services\Api();
$user = $userRepository->findById($user_id);
if ( ! $user) {
return $api->errorNotFound();
}
$params = [
'offset' => $api->getOffset(),
'limit' => $api->getLimit()
];
$user->posts = $this->postRepository->findWithUser($user_id, $params);
// It used to be this, using $fractal, that I injected as method parameter
// I can now also remove the injected Manager $fractal from this method
// $fractal->parseIncludes('posts');
// I created a new getFractal() method on my Api class, that gives me the proper Fractal instance
$api->getFractal()->parseIncludes('posts');
return $api->respondWithItem($user, new UserItemTransformer());
}
Я просто пойду сижу в углу и действительно буду на некоторое время уйти.
Других решений пока нет …