如何使用自定义 JMS 序列化程序处理程序设置 Nelmio Doc

Posted

技术标签:

【中文标题】如何使用自定义 JMS 序列化程序处理程序设置 Nelmio Doc【英文标题】:How to set Nelmio Doc with a custom JMS Serializer Handler 【发布时间】:2020-01-24 11:45:49 【问题描述】:

在生成的 NelmioApiBundle 中,我的关系显示为 而不是 0。

我使用自定义 JMS 处理程序来处理对象关系。 (RelationHandler)

在我的关系中,我指定了一个特殊的类作为给定模型 (ChildRelation) 中的类型。然后,处理程序管理从 Object 到 ID 的转换。 这对 JMS Serializer 非常有用,但不适用于相应的 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": 

有什么好办法吗?

【问题讨论】:

【参考方案1】:

解决这个问题的方法是简单地引入你自己的 ObjectDescriber 来监听特定的对象类型。该类可能如下所示:

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

瞧!

【讨论】:

以上是关于如何使用自定义 JMS 序列化程序处理程序设置 Nelmio Doc的主要内容,如果未能解决你的问题,请参考以下文章

跨 AppDomain 的自定义序列化

带有自定义结果文档处理程序的 Saxon 序列化程序选项

Java Jackson如何在自定义序列化程序中为对象使用默认序列化程序

如何在 Jackson 中使用自定义序列化程序?

JMS 队列的最大数量

使用 WIX 安装程序在自定义操作中停止设置错误