Я использую Фрактальная библиотека превратить 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 (если бы это было возможно), потому что мне действительно нужно использовать другой трансформатор.
Таким образом, вопрос заключается в следующем: есть ли что-то во Фрактале, которое позволяет мне сделать это более простым / понятным способом, или есть лучший способ сделать это, будь то Фрактальный путь или нет?
Задача ещё не решена.
Других решений пока нет …