jlm/serializer-expression-bundle

此包已被废弃且不再维护。没有建议的替代包。

允许您在新的运行时排除策略中使用 Symfony 表达式

dev-master / 0.1.x-dev 2016-01-15 20:41 UTC

This package is not auto-updated.

Last update: 2021-04-26 09:20:59 UTC


README

Build Status Coverage Status Total Downloads Latest Stable Version

#JLMSerializerExpressionBundle

此包可以将 JLMSerializerExpression 库轻松集成到您的 Symfony 应用程序中。该库为 JMSSerializerBundle 添加了 @excludeIf 注解和表达式语言支持,以便在运行时根据表达式隐藏单个字段。

此包在 DI 容器中注册必要的服务,包括一个预先配置的 ExclusionStrategy 对象,可以直接添加到任何 SerializationContext

安装

您可以通过将以下内容添加到您的 composer.json 文件中来通过 Composer 安装此包

"require": {
    # ..
    "jlm/serializer-expression-bundle": "dev-master"
    # ..
}

然后,将包添加到您的 AppKernel.php 中的 Kernel(如果使用 Symfony 标准版)

public function registerBundles()
    {
        $bundles = array(
            /* ... */
            new JLM\SerializerExpressionBundle\JLMSerializerExpressionBundle(),
        );

        return $bundles;
    }

配置

此包目前没有公开配置。它将直接工作。

服务

此包将提供以下预配置的服务。请参阅 SerializerExpression 库 了解这些服务的详细信息。

jlm_serializer_expression.expression_based_exclusion_strategy

这是预配置的排除策略,它将执行 @excludeIf 注解提供的表达式,以确定在运行时是否包含特定的对象属性。 这可能是您唯一需要的服务

jlm_serializer_expression.metadata.metadata_factory

此服务是 Johannes Schmitt 的 Metadata 库中的 Metadata\MetadataFactory 实例。此工厂已预先配置,具有读取 excludeIf 注解的注解驱动程序以及使用您的 Symfony 应用程序的内核缓存目录的基于文件的缓存。如果您选择实例化 JLM\SerializerExpression\Exclusion\ExpressionBasedExclusionStrategy 的单独实例,除非您有很好的理由使用另一个,否则应将此元数据工厂传递给它。

jlm_serializer_expression.expression_language

这是捆绑的表达式语言(Symfony\Component\ExpressionLanguage\ExpressionLanguage的实例),它提供对所有服务、容器和包含用于直接传递安全表达式的secure方法的访问。这是由@excludeIf注解使用的语言,也是预配置排除策略传递的语言。有关表达式语言的更多信息,请参阅 相关的Symfony文档

捆绑的ExpressionLanguage版本提供以下方法

  • param - 接受一个参数的名称并返回其值,例如:@excludeIf("param('myParam') == true")
  • service - 接受一个服务的ID并返回它,例如:@excludeIf("service('myService').foo()")
  • secure - 接受一个字符串,该字符串本身就是一个表达式,直接传递给安全上下文,例如:@excludeIf("secure(""has_role('ROLE_ADMIN')"")")(注意双引号,这是我们嵌入表达式到表达式中的方式)

jlm_serializer_expression.fos_rest_view_handler

此服务提供了与FOSRestBundle的集成,详细信息如下。

为您的类添加注解

<?php

use JLM\SerializerExpression\Annotation\ExcludeIf;

class User
{
    
    public $firstName = 'Jason';

    public $lastName = 'McClellan';
   /**
     * @ExcludeIf("secure(""has_role('ROLE_ADMIN')"")")
     */
    public $phone = '555-555-5555';
    /**
     * @ExcludeIf("secure(""has_role('ROLE_ADMIN')"")")
     */
    public $address ='New York, NY';

    public $occupation = 'Software';
}

上述注解将确保只有具有ROLE_ADMIN角色的用户才会序列化$phone$address字段。请注意,我们正在使用此捆绑包的ExpressionLanguage实现提供的secure函数。

使用排除策略

在通过JMS\Serializer\Serializer实例序列化对象时,您必须将我们的排除策略添加到SerializationContext实例,并将其与对象实例和所需的格式一起传递给serialize()方法。以下是一个相当冗长的示例

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use JMS\Serializer\SerializerBuilder;
use JMS\Serializer\SerializationContext;

class UserController extends Controller
{
    public function getUsers()
    {
        $users = ...
        $serializationContext = SerializationContext::create();
        $exclusionStrategy = $this->get('jlm_serializer_expression.expression_based_exclusion_strategy');
        $serializationContext->addExclusionStrategy($exclusionStrategy);
        // $serializer = $this->get('jms_serializer') // if using JMSSerializerBundle
        $serializer = SerializerBuilder::create()->build();

        $serializedContent = $serializer->serialize($data, 'json', $serializationContext);
        
        $response = new Response($serializedContent);
        $response->headers->set('Content-Type', 'application/json');
        
        return $response;
    }
}

FOSRestBundle集成

如果您正在使用FOSRestBundle来更容易地创建无格式控制器(您应该这样做!)那么序列化过程会简单得多。您需要做的就是为FOSRestBundle更改一点配置,以便它使用此捆绑包提供的ViewHandler,这将自动将新的ExpressionBasedExclusionStrategy添加到由FOSRestBundle使用的内置SerializationContext

fos_rest:
  service:
    view_handler: jlm_serializer_expression.fos_rest_view_handler

这就完了!您的注解类将自动正确序列化,尊重@excludeIf注解。