我正在尝试使用JMSSerializerBundle,但运行后未列出该服务app/console container:debug | grep jms_serializer
$ app/console container:debug | grep jms_serializer
jms_serializer.json_deserialization_visitor container JMS\SerializerBundle\Serializer\JsonDeserializationVisit
jms_serializer.json_serialization_visitor container JMS\SerializerBundle\Serializer\JsonSerializationVisitor
jms_serializer.metadata.lazy_loading_driver container Metadata\Driver\LazyLoadingDriver
jms_serializer.metadata_driver container Metadata\Driver\DriverChain
jms_serializer.naming_strategy container JMS\SerializerBundle\Serializer\Naming\CacheNamingStrate
jms_serializer.xml_deserialization_visitor container JMS\SerializerBundle\Serializer\XmlDeserializationVisito
jms_serializer.xml_serialization_visitor container JMS\SerializerBundle\Serializer\XmlSerializationVisitor
jms_serializer.yaml_serialization_visitor container JMS\SerializerBundle\Serializer\YamlSerializationVisitor
Run Code Online (Sandbox Code Playgroud)
安装后
composer require jms/serializer-bundle
Run Code Online (Sandbox Code Playgroud)
并配置
// in AppKernel::registerBundles()
$bundles = array(
// ...
new JMS\SerializerBundle\JMSSerializerBundle($this),
// ...
);
Run Code Online (Sandbox Code Playgroud)
如果您要在某个地方使用
$this->get('jms_serializer')
Run Code Online (Sandbox Code Playgroud)
我得到错误 You have requested a non-existent service "jms_serializer".
我该如何解决?
我想用JMSSerializerBundle手动完成JSON.HandlerCallback遇到了一些麻烦.这是一个代码:
namespace Company\Bundle\Model;
use JMS\Serializer\Annotation\Type;
use JMS\Serializer\Annotation\SerializedName;
use JMS\Serializer\Annotation\HandlerCallback;
use JMS\Serializer\JsonDeserializationVisitor;
use JMS\Serializer\DeserializationContext;
use JMS\Serializer\TypeParser;
use JMS\Serializer\Serializer;
class Blog
{
protected $blogName;
protected $blogUrl;
protected $blogCategory;
/**
* @Type("array<Company\Bundle\Model\Post>")
* @SerializedName("data")
*/
protected $posts;
/**
* @param mixed $posts
*/
public function setPosts($posts)
{
$this->posts = $posts;
}
/**
* @return mixed
*/
public function getPosts()
{
return $this->posts;
}
/**
* @HandlerCallback("json", direction = "deserialization")
*/
public function deserializeFromJson(JsonDeserializationVisitor $visitor, array $data, DeserializationContext $context)
{
$this->blogName = $data['data'][0]['blogName'];
$this->blogUrl …Run Code Online (Sandbox Code Playgroud) 据我所知,当控制器获得post/put/patch请求时,JMSSerializerBundle的反序列化与symfony表单组件的功能相同吗?
因此,要么我为例如UserType创建一个symfony自定义formType,当我收到请求时,我会执行类似$ form-> handleRequest($ request)的操作,或者使用JMSSerializerBundle将请求反序列化为最终存储的文档/实体.
有没有人有这两种方法的经验?目前我只熟悉表格方式......我应该选择哪一个?
我正在谈论的应用程序纯粹是Restful,没有twig html模板,FOSRestbundle正在进行所有RESTful路由.
我正在创建一个symfony2项目并使用JMS序列化程序包来序列化我的对象以进行数据库存储(我知道这不是最好的方法).
但现在我的问题是,当我更改对象的属性并反序列化Json字符串时,JMS序列化程序忽略不存在的属性而不是抛出错误,这实际上很棒.但我想记录这样的事件.
下面是一个例子来说明我的问题
我的数据库中的Json字符串:
$dataToBeDeserialized = {"title":"testing123","text":"Lorem Ipsum"}
Run Code Online (Sandbox Code Playgroud)
识别TestClass:
/**
* @Type("string")
*/
protected title;
/**
* @Type("string")
*/
protected text;
Run Code Online (Sandbox Code Playgroud)
反序列化方法:
$this->serializer = SerializerBuilder::create()->build();
$this->serializer->deserialize($dataToBeDeserialized, 'TestClass', 'json');
Run Code Online (Sandbox Code Playgroud)
这导致:
TestClass {
title: "testing123",
text: "Lorem Ipsum"}
Run Code Online (Sandbox Code Playgroud)
但是,当我更改我的Testclass并重命名(或删除)标题时,让我们说"title2",反序列化器忽略Json字符串中的"title"属性.这导致:
TestClass {
title2: "",
text: "Lorem Ipsum"}
Run Code Online (Sandbox Code Playgroud)
那没问题.数据库中的数据是错误的.但我想记录这个问题.我该怎么做?如果可能的话,我不想搞乱JMS序列化程序的代码(因为我不能再更新它).在我的TestClass中查找空属性也不是最好的方法,因为它们可以为null.
我Category OneToMany Post在doctrine2设置中有这样的关联:
类别:
...
/**
* @ORM\OneToMany(targetEntity="Post", mappedBy="category")
* @Type("ArrayCollection<Platform\BlogBundle\Entity\Post>")
*/
protected $posts;
...
Run Code Online (Sandbox Code Playgroud)
帖子:
...
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="posts")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
* @Type("Platform\BlogBundle\Entity\Category")
*/
protected $category;
...
Run Code Online (Sandbox Code Playgroud)
我试图反序列化后面的json对象(数据库中已存在id为1的两个实体)
{
"id":1,
"title":"Category 1",
"posts":[
{
"id":1
}
]
}
Run Code Online (Sandbox Code Playgroud)
使用JMSSerializerBundle序列化程序的deserialize方法配置了doctrine对象构造函数
jms_serializer.object_constructor:
alias: jms_serializer.doctrine_object_constructor
public: false
Run Code Online (Sandbox Code Playgroud)
结果如下:
Platform\BlogBundle\Entity\Category {#2309
#id: 1
#title: "Category 1"
#posts: Doctrine\Common\Collections\ArrayCollection {#2314
-elements: array:1 [
0 => Platform\BlogBundle\Entity\Post {#2524
#id: 1
#title: "Post 1"
#content: "post 1 content"
#category: null
}
] …Run Code Online (Sandbox Code Playgroud) 我目前正在使用 NelmioApiDocBundle,我对它还不是很熟悉。我正在编写的 API 必须提供更改特定用户密码的途径。文档应说明,更改密码既需要旧密码,也需要新密码。因为我没有发现之间的区别的解释Requirements和Parameters,我想首先是用于从路由数据,而后者用于API调用本身。
归档此类文档的第一次尝试是实现一个简单的模型,然后 JMSSerializerBundle 会自动转换该模型:
class ChangePasswordParam
{
/**
* @Type("string")
* @var string
*/
protected $oldPassword;
/**
* @Type("string")
* @var string
*/
protected $newPassword;
}
Run Code Online (Sandbox Code Playgroud)
Controller 通过这个 action 方法接受 API 调用:
/**
* Changes the password for a specific user.
*
* @Post("/{username}/changepassword")
* @View()
* @ApiDoc(
* description="Changes the password of a User",
* input="FQCN\ChangePasswordParam"
* )
*
* @param string $username
* @param ChangePasswordParam $passwordParam
*
* @return Response
*/ …Run Code Online (Sandbox Code Playgroud) php symfony fosrestbundle jmsserializerbundle nelmioapidocbundle
我正在尝试编写一个REST API,它在Symfony2中使用来自PUT请求的JSON.将JSON反序列化为实体类型 - 但是如果JSON中的属性类型与实体的相应属性不匹配,则JMS Serializer似乎强制来自JSON的类型而不是抛出异常.
例如 …
{ "id" : "123" }
Run Code Online (Sandbox Code Playgroud)
......会导致......
int(123)
Run Code Online (Sandbox Code Playgroud)
...如果属性id在实体中定义为整数.
但我希望JMS Serializer能够抛出异常.有谁知道如何实现这一目标?
我发现JMS Serializer的类型处理的一个问题是:
{ "id" : "n123" }
Run Code Online (Sandbox Code Playgroud)
会导致......
int(0)
Run Code Online (Sandbox Code Playgroud)
这是完全不受欢迎的.
有人可以指出我正确的方向吗?
symfony jmsserializerbundle json-deserialization jms-serializer
我目前正在学习如何使用Symfony 3(带有FOSRestBundle)和JMS Serializer来实现一个相对简单的API.我最近一直在尝试实现作为消费客户端指定哪些字段应该在响应中返回的能力(请求的实体和关系中的两个字段).例如;
/posts没有包含查询字符串将返回所有Post实体属性(例如title,body,posted_at等)但没有关系./posts?fields[]=id&fields[]=title只会返回帖子的ID和标题(但同样没有关系)/posts?include[]=comment将包括上述但与Comment关系(及其所有属性)/posts?include[]=comment&include[]=comment.author 将如上所述返回,但也包括每个评论中的作者尝试实施这是一个明智的事情吗?我最近对此进行了大量的研究,我看不出我可以1)限制单个字段的检索,2)只有在明确要求时才返回相关实体.
我已经有了这个概念的初步播放,但是即使确保我的存储库只返回Post实体(即没有注释),JMS Serializer似乎触发了所有相关实体的延迟加载,我似乎无法阻止它.我已经看到了一些链接,例如这个例子但是修复似乎不起作用(例如在该链接中,$object->__load()在原始代码中从未到达注释掉的调用.
我已经使用JMSSerializer的Group功能实现了一个基于关系的示例,但是当我理想情况下能够构建一个Doctrine Querybuilder实例,动态添加andWhere()调用并让序列化程序只返回那些确切的数据而不加载时,我觉得很奇怪.在人际关系中
我为此撒谎而道歉,但我已经坚持了一段时间,我很感激任何输入!谢谢.
这是我的情况:
我正在尝试编写一个适用于“严格”类型(整数、布尔值和浮点数)的 Symfony REST API,因为默认的 Symfony 行为不支持它,我想避免强制转换类型(例如:JMS Serializer 转换字符串值成整数字段类型)
为此,我创建了一个实现JMS\Serializer\Handler\SubscribingHandlerInterface
(例如 a StrictIntegerHandler)的自定义处理程序:
<?php
namespace AppBundle\Serializer;
use JMS\Serializer\Context;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\JsonDeserializationVisitor;
use JMS\Serializer\JsonSerializationVisitor;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
class StrictIntegerHandler implements SubscribingHandlerInterface
{
public static function getSubscribingMethods()
{
return [
[
'direction' => GraphNavigator::DIRECTION_DESERIALIZATION,
'format' => 'json',
'type' => 'strict_integer',
'method' => 'deserializeStrictIntegerFromJSON',
],
[
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
'format' => 'json',
'type' => 'strict_integer',
'method' => 'serializeStrictIntegerToJSON',
],
];
}
public function deserializeStrictIntegerFromJSON(
JsonDeserializationVisitor …Run Code Online (Sandbox Code Playgroud) 我目前正在参与一个在 API 中使用 JMS Serializer 的项目。我们使用了很多虚拟属性——尤其是序列化映射中的表达式 Prop。
App\Entity\MyEntity:
exclusion_policy: none
properties:
id:
expose: true
groups: ['default']
virtual_properties:
child:
exp: object.getChildObject().getIdentifier()
serialized_name: child_identifier
type: string
groups: ['default']
amount:
exp: object.getOtherChild().getAmount()
serialized_name: other_child_amount
type: string
groups: ['default']
Run Code Online (Sandbox Code Playgroud)
这将允许我拥有子属性,而不必为更简洁的 JSON 创建 getter - 对于这些虚拟属性中有一些逻辑的情况非常有用(例如:以下示例中的“金额”)
{
"id": 123,
"child": "Identifier_52",
"amount": 100
}
// instead of
{
"id": 123,
"child": { "identifier" : "Identifier_52" }
"amount": { "weight": 20, "number": 5 }
}
Run Code Online (Sandbox Code Playgroud)
我们最近考虑切换到Symfony Serializer,到目前为止我还没有找到一种简单的方法来重用或重新实现这些配置(表达式)。如果我将属性 …
php serialization symfony jmsserializerbundle jms-serializer
symfony ×9
php ×6
doctrine-orm ×2
associations ×1
forms ×1
jms ×1
json ×1
post ×1
rest ×1
symfony-2.1 ×1
symfony-2.6 ×1
visitor ×1