Как насчет этого: http://jmsyst.com/libs/serializer/master/handlers
Таким образом, вы определяете класс, который получает объект и возвращает текст или массив (который будет преобразован в json).
У вас есть класс IndexedStuff, который содержит странное вычисляемое поле, которое по какой-то причине должно вычисляться во время сериализации.
<?php
namespace Project/Model;
class IndexedStuff
{
public $name;
public $value;
public $rawData;
}
Теперь создайте обработчик
<?php
namespace Project/Serializer;
use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\JsonSerializationVisitor;
use JMS\Serializer\Context;
class MyHandler implements SubscribingHandlerInterface
{
public function setEntityManager(Registry $registry) {
// Inject registry instead of entity manager to avoid circular dependency
$this->em = $registry->getEntityManager();
}
public static function getSubscribingMethods()
{
return array(
array(
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
'format' => 'json',
'type' => 'Project/Model/IndexedStuff',
'method' => 'serializeIndexedStuffToJson',
),
);
}
public function serializeIndexedStuffToJson(JsonSerializationVisitor $visitor, Project/Model/IndexedStuff $stuff, array $type, Context $context)
{
// Build your object here and return it
$score = $this->em->find("ProjectBundle:Calculator", $stuff->value)
return array("score" => $score->getIndexScore(), "name"=> $score->name
}
}
Наконец зарегистрируйте сервис
services:
project.serializer.stuff:
class: Project\Serializer\MyHandler
calls:
- [setEntityManager, ["@doctrine"]]
Теперь везде, где вы хотите сериализовать объект типа «IndexedStuff», вы получите такой json
{"name": "myName", "score" => 0.3432}
Таким образом, вы можете полностью настроить сериализацию вашего объекта.
person
Álvaro García
schedule
13.06.2016