基本上我想将json反序列化为用户对象.像这样
$serializer = $this->get('jms_serializer');
$data = $serializer->deserialize($this->get('request')->getContent(),
'My\FooBundle\Entity\User', 'json');
Run Code Online (Sandbox Code Playgroud)
请求数据传递给反序列化器:
{"id":2,"username":"...@gmail.com","username_canonical":"...@gmail.com", ... }
Run Code Online (Sandbox Code Playgroud)
抛出的错误:
request.CRITICAL:未捕获的PHP异常JMS\Serializer\Exception\RuntimeException:"您必须为FOS\UserBundle\Model\User :: $ username定义类型." 在...\vendor\jms\serializer\src\JMS\Serializer\GenericDeserializationVisitor.php第170行[] []
我用的是sf 2.3.是否有任何必须设置用于反序列化fos用户类?知道为什么我收到这条消息以及如何修复它?
也许这只是我对这个注释的误解,然而它并没有按预期工作.
我有以下对象图
User
-> Company
-> Users
-> Groups
-> Permissions
Run Code Online (Sandbox Code Playgroud)
如你所见,会有一些递归.JMS通过不序列化其他用户的公司属性以及当前用户来很好地处理这个问题.
但是,我希望序列化停止并包含公司.
我试过这个期望,一旦级别$ context-> level = 2,它就会停止
<?php
namespace FinalConcept\TimeTracker\EntitiesBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;
/**
* FinalConcept\TimeTracker\EntitiesBundle\Entity
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="FinalConcept\TimeTracker\EntitiesBundle\Repository\UserRepository")
*/
class User implements UserInterface, \Serializable
{
/**
* @ORM\ManyToOne(targetEntity="company", inversedBy="users")
* @ORM\JoinColumn(name="company_id", referencedColumnName="id")
* @JMS\MaxDepth(depth=1)
*/
private $company;
}
Run Code Online (Sandbox Code Playgroud)
然而,这种情况并非如此.即使单步执行代码也没有说明如何阻止它.
我很乐意创建一个自定义处理程序,如果我只能为特定路径调用它,即User.Company
对于具有以下图形的User.Groups,我也需要这个
User
-> Groups
-> Permissions
-> Users
-> Groups
-> users ....
Run Code Online (Sandbox Code Playgroud)
预先感谢您提供有关如何限制对象图的序列化深度的任何帮助
按照提供的说明使用deps文件安装JMS Serializer Bundle后,出现以下错误:
Fatal error: Class 'Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension' not found in /vendor/bundles/JMS/SerializerBundle/DependencyInjection/JMSSerializerExtension.php on line 30
Run Code Online (Sandbox Code Playgroud)
Symfony中不存在该类.我正在使用Symfony v2.0.17.有没有解决这个问题?
根据文件:
该容器可用于任何传统的Symfony2控制器,您可以通过get()快捷方法访问容器的服务
所以,我设法通过调用以下方法在Controller中调用和使用JMSSerializer:
$serializer = $this->get('serializer');
Run Code Online (Sandbox Code Playgroud)
但是,如何在自定义类中调用容器?相同的命令失败,表示调用未定义方法get()的致命错误.
我正在尝试运行JMSSerializer.我的简单代码
use JMS\Serializer\Annotation\Type;
class Comment
{
private $msg;
public function __construct($msg)
{
$this->msg = $msg;
}
}
class Person
{
/**
* @Type("array<Comment>")
*/
private $commentList;
public function addComment(Comment $comment)
{
$this->commentList[] = $comment;
}
}
$type = new Type;
$serializer = JMS\Serializer\SerializerBuilder::create()->build();
$data = new Person();
$data->addComment(new Comment('hey'));
var_dump($serializer->serialize($data, 'json'));
Run Code Online (Sandbox Code Playgroud)
失败了
PHP Fatal error: Uncaught exception 'Doctrine\Common\Annotations\AnnotationException' with message '[Semantical Error] The annotation "@JMS\Serializer\Annotation\Type" in property Person::$commentList does not exist, or could not be auto-loaded.' in xxx.php:52
Run Code Online (Sandbox Code Playgroud)
好的,但如果我添加线
$type …Run Code Online (Sandbox Code Playgroud) 我在实体中有"图像"字段.但取决于我想要显示的不是原始图像,而是图像的预览(我在LiipImagineBundle中制作).我能想象的一个解决方案:
public function cgetAction(Request $request)
{
$events = $this->container->get('gc.event_manager')->getEvents();
foreach ($events as &$event) {
$previewURL = $this->getPreview($event->getPhoto());
$event->setPhoto($previewURL);
}
$event = false;
return array(
'events' => $events,
);
}
Run Code Online (Sandbox Code Playgroud)
但我不喜欢它,因为如果一个实体拥有深层子实体,那么代码就会非常混乱.
怎么做正确?
我想使用JMSSerializerBundle和FOSRestBundle仅公开我的User类的一些属性.似乎序列化程序包没有读取我的配置文件.
我的用户类在src/AppBundle/Entity/User,它扩展了FOSUserBundle用户类.
这是我的User类:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Component\Validator\Constraints as Assert;
/**
* User
*
* @ORM\Table(name="backoffice_user")
* @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\UserRepository")
*/
class User extends BaseUser
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="lastname", type="string", length=70)
*/
private $lastname;
/**
* @var string
*
* @ORM\Column(name="firstname", type="string", length=70)
*/
private $firstname;
}
Run Code Online (Sandbox Code Playgroud)
这是我的app/config.yml文件
jms_serializer:
metadata:
debug: true
auto_detection: …Run Code Online (Sandbox Code Playgroud) 我正在通过 cURL 调用 API 方法,我得到了这个响应:
<?xml version="1.0" encoding="UTF-8"?>
<jobInfo
xmlns="http://www.force.com/2009/06/asyncapi/dataload">
<id>75080000002s5siAAA</id>
<operation>query</operation>
<object>User</object>
<createdById>00580000008ReolAAC</createdById>
<createdDate>2015-06-23T13:03:01.000Z</createdDate>
<systemModstamp>2015-06-23T13:03:01.000Z</systemModstamp>
<state>Open</state>
<concurrencyMode>Parallel</concurrencyMode>
<contentType>CSV</contentType>
<numberBatchesQueued>0</numberBatchesQueued>
<numberBatchesInProgress>0</numberBatchesInProgress>
<numberBatchesCompleted>0</numberBatchesCompleted>
<numberBatchesFailed>0</numberBatchesFailed>
<numberBatchesTotal>0</numberBatchesTotal>
<numberRecordsProcessed>0</numberRecordsProcessed>
<numberRetries>0</numberRetries>
<apiVersion>34.0</apiVersion>
<numberRecordsFailed>0</numberRecordsFailed>
<totalProcessingTime>0</totalProcessingTime>
<apiActiveProcessingTime>0</apiActiveProcessingTime>
<apexProcessingTime>0</apexProcessingTime>
</jobInfo>
Run Code Online (Sandbox Code Playgroud)
我想以一种简单的方式访问|解析该结果,但我不知道是否应该反序列化 XML 或只是尝试使用一些 PHP 原生 XML 函数来读取它。那么关于这个第一个疑问的想法?
如果反序列化 XML 更好,那么我已经阅读了这篇文章 “在 Symfony2 中使用 JMSSerializerBundle 反序列化 XML”,并且我根本不清楚是否需要一个实体来实现这一点。还有这个其他主题,仍然让我感到困惑。对此有何建议?经验?建议?
我在设置JMS Serializer和FOSRestBundle时遇到问题,无法序列化这个自定义存储库方法.
如果我使用$schedules = $em->getRepository('RadioBundle:Schedule')->findAll();它工作正常,但当我尝试我的自定义方法时,没有任何字段被排除.
有人可以帮我弄清楚什么是错的吗?
控制器:
use RadioBundle\Entity\Schedule;
use Symfony\Component\HttpFoundation\Request;
use FOS\RestBundle\Controller\Annotations\View;
class ScheduleController extends BaseController
{
/**
* @param $date
* @return \Symfony\Component\HttpFoundation\Response
* @View(serializerGroups={"schedule"})
*/
public function getSchedulesScheduleAction($date)
{
$em = $this->getDoctrine()->getManager();
list($startDate, $endDate) = $this->get('radio.utils.date_and_time')->findWeekRange($date);
$schedules = $em->getRepository('RadioBundle:Schedule')->findByRange($startDate, $endDate);
$view = $this->view(
[
'schedules' => $schedules,
],
200
);
return $this->handleView($view);
}
}
Run Code Online (Sandbox Code Playgroud)
存储库方法:
class ScheduleRepository extends EntityRepository
{
/**
* @param \DateTime $startDate
* @param \DateTime $endDate
* @return array
*/
public function …Run Code Online (Sandbox Code Playgroud) 在Symfony应用程序中,可以在调用JsonResponse()控制器时使用JMS序列化程序吗?
$response = new ApiResponse(ApiResponse::STATUS_SUCCESS);
return new JsonResponse($response); // <-- I would like to use the JMS serializer
Run Code Online (Sandbox Code Playgroud)
谢谢.
symfony ×9
php ×2
annotations ×1
doctrine ×1
doctrine-orm ×1
json ×1
symfony-2.0 ×1
symfony-2.3 ×1
xml ×1