jlm / serializer-expression-bundle
允许您在新的运行时排除策略中使用 Symfony 表达式
Requires
- php: >=5.5
- jlm/serializer-expression: dev-master
- symfony/framework-bundle: ~2.4|~3.0
- symfony/security-bundle: ~2.4|~3.0
Requires (Dev)
- friendsofsymfony/rest-bundle: ~1.3
- jms/serializer-bundle: ~0.13|~1.0
- phpunit/phpunit: ~4.0|~5.0
- satooshi/php-coveralls: dev-master
- sensio/framework-extra-bundle: ~3.0
- symfony/browser-kit: ~2.6|~3.0
- symfony/finder: ~2.6|~3.0
- symfony/twig-bundle: ~2.6|~3.0
Suggests
This package is not auto-updated.
Last update: 2021-04-26 09:20:59 UTC
README
#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
注解。