如何使用自定义 JMS 序列化程序处理程序设置 Nelmio Doc
How to set Nelmio Doc with a custom JMS Serializer Handler
在生成的 NelmioApiBundle 中,我的关系显示为 {} 而不是 0。
我为对象关系使用自定义 JMS 处理程序。 (关系处理程序)
在我的关系中,我指定了一个特殊的 Class 作为给定模型 (ChildRelation) 中的类型。然后处理程序管理从 Object 到 ID 的转换。
这对 JMS 序列化程序非常有效,但对相应的 Nelmio API Doc
无效
我曾尝试直接在 ChildRelation 上使用 @SWG\Schema,但这没有用
在此示例中,角色在技术上是一个继承自 Concrete 的 UserRole 对象。
## serializer/Model.DataObject.User.yml
AppBundle\Model\DataObject\User:
access_type: public_method
properties:
capabilities:
groups: [detailed, data]
type: array<string>
role:
groups: [detailed, list, data, create, update]
type: AppBundle\Model\DataObject\ChildRelation
// RelationHandler Serializer:
final class RelationsHandler implements SubscribingHandlerInterface
{
(...)
public function serializeConcreteToId(JsonSerializationVisitor $visitor, Concrete $concrete, array $type, SerializationContext $context
) {
return $concrete->getId();
}
}
我希望获得与调用端点时相同的模型。
{
"role": 271,
"capabilities": []
}
但是大摇大摆的响应看起来像这样:
{
"capabilities": [],
"role": {}
}
有什么好的方法吗?
这个问题的解决方案是简单地引入你自己的 ObjectDescriber 来监听特定的对象类型。 class 可能看起来像这样:
use EXSyst\Component\Swagger\Schema;
use Nelmio\ApiDocBundle\Describer\ModelRegistryAwareInterface;
use Nelmio\ApiDocBundle\Describer\ModelRegistryAwareTrait;
use Nelmio\ApiDocBundle\Model\Model;
use Nelmio\ApiDocBundle\ModelDescriber\ModelDescriberInterface;
class ChildRelationDescriber implements ModelDescriberInterface, ModelRegistryAwareInterface
{
use ModelRegistryAwareTrait;
public function supports(Model $model): bool
{
return "AppBundle\Model\DataObject\ChildRelation" === $model->getType()->getClassName();
}
public function describe(Model $model, Schema $schema)
{
$schema->setType('integer');
}
}
在您的应用程序中注册它
child_relation_describer:
class: AppBundle\ChildRelationDescriber
tags:
- {name: nelmio_api_doc.model_describer, priority: 1000}
瞧!
在生成的 NelmioApiBundle 中,我的关系显示为 {} 而不是 0。
我为对象关系使用自定义 JMS 处理程序。 (关系处理程序)
在我的关系中,我指定了一个特殊的 Class 作为给定模型 (ChildRelation) 中的类型。然后处理程序管理从 Object 到 ID 的转换。 这对 JMS 序列化程序非常有效,但对相应的 Nelmio API Doc
无效我曾尝试直接在 ChildRelation 上使用 @SWG\Schema,但这没有用
在此示例中,角色在技术上是一个继承自 Concrete 的 UserRole 对象。
## serializer/Model.DataObject.User.yml
AppBundle\Model\DataObject\User:
access_type: public_method
properties:
capabilities:
groups: [detailed, data]
type: array<string>
role:
groups: [detailed, list, data, create, update]
type: AppBundle\Model\DataObject\ChildRelation
// RelationHandler Serializer:
final class RelationsHandler implements SubscribingHandlerInterface
{
(...)
public function serializeConcreteToId(JsonSerializationVisitor $visitor, Concrete $concrete, array $type, SerializationContext $context
) {
return $concrete->getId();
}
}
我希望获得与调用端点时相同的模型。
{
"role": 271,
"capabilities": []
}
但是大摇大摆的响应看起来像这样:
{
"capabilities": [],
"role": {}
}
有什么好的方法吗?
这个问题的解决方案是简单地引入你自己的 ObjectDescriber 来监听特定的对象类型。 class 可能看起来像这样:
use EXSyst\Component\Swagger\Schema;
use Nelmio\ApiDocBundle\Describer\ModelRegistryAwareInterface;
use Nelmio\ApiDocBundle\Describer\ModelRegistryAwareTrait;
use Nelmio\ApiDocBundle\Model\Model;
use Nelmio\ApiDocBundle\ModelDescriber\ModelDescriberInterface;
class ChildRelationDescriber implements ModelDescriberInterface, ModelRegistryAwareInterface
{
use ModelRegistryAwareTrait;
public function supports(Model $model): bool
{
return "AppBundle\Model\DataObject\ChildRelation" === $model->getType()->getClassName();
}
public function describe(Model $model, Schema $schema)
{
$schema->setType('integer');
}
}
在您的应用程序中注册它
child_relation_describer:
class: AppBundle\ChildRelationDescriber
tags:
- {name: nelmio_api_doc.model_describer, priority: 1000}
瞧!