如何为 JMS Serializer 创建自定义排除策略,以便我可以在运行时决定是否包含特定字段?

2023-11-22

正如标题所示,我试图在运行时决定是否在序列化中包含字段。就我而言,此决定将基于权限。

我正在使用 Symfony 2,所以我想做的是添加一个名为 @ExcludeIf 的附加注释,它接受安全表达式。

我可以处理元数据的注释解析和存储,但我无法了解如何将自定义排除策略与库集成。

有什么建议么?

注意:排除策略是 JMS 代码库中的实际构造,我只是无法找出在其他策略之上集成额外策略的最佳方法

PS:我之前曾问过这个问题,并被指出要使用组。由于各种原因,这对于我的需求来说是一个非常糟糕的解决方案。


你只需要创建一个类来实现JMS\Serializer\Exclusion\ExclusionStrategyInterface

<?php

namespace JMS\Serializer\Exclusion;

use JMS\Serializer\Metadata\ClassMetadata;
use JMS\Serializer\Metadata\PropertyMetadata;
use JMS\Serializer\Context;

interface ExclusionStrategyInterface
{
    /**
     * Whether the class should be skipped.
     *
     * @param ClassMetadata $metadata
     *
     * @return boolean
     */
    public function shouldSkipClass(ClassMetadata $metadata, Context $context);

    /**
     * Whether the property should be skipped.
     *
     * @param PropertyMetadata $property
     *
     * @return boolean
     */
    public function shouldSkipProperty(PropertyMetadata $property, Context $context);
}

在您的情况下,您可以在中实现您自己的自定义逻辑shouldSkipProperty方法并始终返回false for shouldSkipClass.

实现示例可以在JMS/序列化器存储库

我们将创建的服务引用为acme.my_exclusion_strategy_service below.


在您的控制器操作中:

<?php

use Symfony\Component\HttpFoundation\Response;
use JMS\Serializer\SerializationContext;

// ....

$context = SerializationContext::create()
    ->addExclusionStrategy($this->get('acme.my_exclusion_strategy_service'));

$serial = $this->get('jms_serializer')->serialize($object, 'json', $context);

return new Response($serial, Response::HTTP_OK, array('Content-Type' => 'application/json'));

或者如果您正在使用 FOSRestBundle

<?php

use FOS\RestBundle\View;
use JMS\Serializer\SerializationContext;

// ....

$context = SerializationContext::create()
    ->addExclusionStrategy($this->get('acme.my_exclusion_strategy_service'))

$view = new View($object);
$view->setSerializationContext($context);

// or you can create your own view factory that handles the creation
// of the context for you

return $this->get('fos_rest.view_handler')->handle($view);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 JMS Serializer 创建自定义排除策略,以便我可以在运行时决定是否包含特定字段? 的相关文章

随机推荐