Включите простые поля на основе контекста в Fractal

Я использую Фрактальная библиотека превратить Book Объект в JSON с помощью простого преобразователя:

class BookTransformer extends \League\Fractal\TransformerAbstract
{
public function transform(Book $book)
{
return [
'name' => $book->getName()
// ...
];
}
}

И я выполняю преобразование следующим образом.

$book = new Book('My Awesome Book');
$resource = new \League\Fractal\Resource\Item($book, new BookTransformer());

$fractal = new \League\Fractal\Manager();
$fractal->setSerializer(new \League\Fractal\Serializer\ArraySerializer());

$json = $fractal->createData($resource)->toJson();

Это прекрасно работает. Тем не менее, у меня есть определенные поля на моем Book объект, который не всегда должен быть включен, потому что это зависит от контекста, в котором выполняется преобразование. В моем конкретном случае использования JSON, возвращаемый на запросы AJAX с моего общедоступного веб-сайта, не должен содержать конфиденциальную информацию, в то время как это должно быть в том случае, когда данные запрашиваются у администратора.

Итак, скажем, что книга имеет topSecretValue поле, которое является строкой. Это поле не должно быть включено в одно преобразование, но должно быть включено в другое. Я посмотрел на трансформатор включает в себя, и поиграл с этим, но это работает только с Ресурсы. В моем случае мне нужно как-то включать разные поля (не ресурсы) для разных контекстов. Я копался и не мог найти в библиотеке Fractal ничего, что могло бы мне помочь, но, может быть, я что-то упустил?

Я придумал рабочее решение, но оно не самое красивое, что мир когда-либо видел. Имея BaseBookTransformer который преобразует поля, которые всегда должны быть включены, я могу расширить этот преобразователь, добавив поля для других контекстов, например, AdminBookTransformer или же TopSecretValueBookTransformerчто-то вроде ниже.

class AdminBookTransformer extends BookTransformer
{
public function transform(Book $book)
{
$arr = parent::transform($book);
$arr['author'] = $book->getTopSecretValue();

return $arr;
}
}

Это работает нормально, хотя и не так «чисто», как использование include (если бы это было возможно), потому что мне действительно нужно использовать другой трансформатор.

Таким образом, вопрос заключается в следующем: есть ли что-то во Фрактале, которое позволяет мне сделать это более простым / понятным способом, или есть лучший способ сделать это, будь то Фрактальный путь или нет?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]