问题描述
我有这门课:
namespace Vop\ProductBundle\Serializer;
use Vop\CoreBundle\Serializer\BaseSerializerHandler;
class ProductSerializerHandler extends BaseSerializerHandler
{
/**
* {@inheritdoc}
*/
public static function getType()
{
return 'vop_product_id';
}
}
如果不使用,我需要将其删除。
基类:
namespace Vop\CoreBundle\Serializer;
use JMS\Serializer\Context;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\VisitorInterface;
use Symfony\Bridge\Doctrine\RegistryInterface;
abstract class BaseSerializerHandler implements SerializerHandlerInterface
{
/**
* @var string
*/
protected $class;
/**
* @var RegistryInterface
*/
protected $registry;
/**
* @param RegistryInterface $registry
* @param string $class
*/
public function __construct(RegistryInterface $registry,$class)
{
$this->registry = $registry;
$this->class = $class;
}
/**
* {@inheritdoc}
*/
public static function getSubscribingMethods()
{
$type = static::getType();
return array(
array(
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,'format' => 'json','type' => $type,'method' => 'serializeObjectToId',),array(
'direction' => GraphNavigator::DIRECTION_DESERIALIZATION,'method' => 'deserializeObjectFromId',)
);
}
/**
* Serialize data object to id.
*
* @param VisitorInterface $visitor
* @param object $data
* @param array $type
* @param Context $context
*
* @return int|null
*/
public function serializeObjectToId(VisitorInterface $visitor,$data,array $type,Context $context)
{
if ($data instanceof $this->class) {
return $visitor->visitInteger($data->getId(),$type,$context);
}
return;
}
/**
* Deserialize object from its id.
*
* @param VisitorInterface $visitor
* @param int $data
*
* @return null|object
*/
public function deserializeObjectFromId(VisitorInterface $visitor,$data)
{
return $this->getRepository()->findOneBy(array('id' => $data));
}
/**
* @return \Doctrine\Common\Persistence\ObjectRepository
*/
private function getRepository()
{
return $this->registry->getRepository($this->class);
}
}
那么如何判断项目中是否使用了ProductSerializerHandler呢?有使用 vop_product_id 的配置。我从配置中删除了 vop_product_id。所以可能是这个类不再使用了。但是如果在任何地方都找不到vop_product_id,我们真的可以说在项目中没有使用ProductSerializerHandler吗?
这里找到了可能是答案的东西,但您仍然可以确认: https://sonata-project.org/bundles/core/3-x/doc/reference/serialization.html
要调用您的处理程序,您可以使用 JMS Serializer 使用的自定义类型,如下所示:
<property name="post" serialized-name="entity_id" type="post_type"/>
并且您的处理程序需要指定类型名称:
// src/Serializer/PostSerializerHandler.php
namespace App\Serializer;
use Sonata\CoreBundle\Serializer\BaseSerializerHandler;
class PostSerializerHandler extends BaseSerializerHandler
{
public static function getType()
{
return 'post_type';
}
}
因此,根据奏鸣曲文档,如果我们想使用处理程序,我们必须使用 getType() 函数中的字符串。就我而言,如果项目中从未使用过来自 getType 的字符串,则不会使用处理程序。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)