我正在构建一个移动应用程序(iOS)和Symfony2 REST后端。在Symfony2上,我的路由工作正常,我已经用AJAX和httpie对它们进行了测试,所有CRUD操作等都很好。现在,我正在尝试从应用程序访问路线。到目前为止,我可以访问路由,当我查看Symfony2 Profiler时,我可以看到最后10个条目中的条目,以验证我的POST和GET请求是否正在访问服务器。现在,我有两个问题,如果人们能为我指明**最佳实践**的方向,我会很高兴。
问题1:虽然我发布的数据可以在"请求"下看到,但当我尝试创建记录时,它只创建NULL记录,这意味着数据正在丢失。这是我用于创建用户的控制器,例如:
public function postUserAction(Request $request)
{
$content = $this->get('request')->getContent();
$serializer = $this->get('jms_serializer');
$entity = $serializer->deserialize($content, 'Name'BundleName'Entity'User', 'json');
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return array(
'entity' => $entity,
);
}
当我查看日志时,唯一突出的是:请求Cookie(无Cookie),请求内容:"请求内容不可用(它是作为资源检索的)。"这告诉我数据丢失了,我如何获取这些数据并使用它?或者它还能是什么?
问题2:当我NSlog(回显它)时,GET返回一个空的JSON响应,没有数据,只有键。我的代码看起来像:
public function getUsersAction()
{
$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository('NameBundle:User')->findAll();
return array(
'entities' => $entities,
);
}
从日志中,它设置了请求Cookies:PHPSSID=>"1ududjjz8383jdlb4ho0j4",但请求内容再次显示:"请求内容不可用(它是作为资源检索的)。"我如何让它用JSON返回数据?这在浏览器AJAX和httpie测试中运行良好。
问题3:使用AFNetworking,我有一个符号常量,我将其设置为APIHost(IP地址),APIPath是文件夹。现在,在我使用原生PHP的早期版本中,我通过用JSON发送参数来构建要在index.PHP中执行的实际代码,所以如果我想要登录,我会发送类似todo:login的内容,但对于Symfony2,我甚至不确定或不知道这种情况下的最佳实践。理想情况下,我想在JSON请求中指定服务器端请求,然后在Symfony2中找到正确的路由,但这是怎么做的吗?如果是,你能提供一个例子吗?解决方法是,每次我需要发出请求时,都要在AFNetworking中指定硬编码路径,我认为该请求与代码紧密耦合,并且每当服务器端发生变化时,我都需要在很多地方进行更改。谢谢,很抱歉问了这么长的问题!
您希望jmsseralizer为您施展魔法。但它不会,你必须先配置它。从您的代码中,我可以看出您使用jmsseralizer是错误的。
在getUsersAction()
中,您必须返回一个序列化的响应,但您返回的是一个对象数组。这将是正确的方式:
public function getUsersAction()
{
$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository('NameBundle:User')->findAll();
$serializer = $container->get('jms_serializer');
return array(
'users' => $jsonContent = $serializer->serialize($entities, 'json');,
);
}
您的post操作基本上看起来不错,但是当json不包含实体USER的每个字段时,反序列化将失败。您可以使用注释配置实体以进行序列化/反序列化。
http://jmsyst.com/libs/serializer/master/reference/annotations
我不确定我是否理解你的最后一个问题,但我认为你必须在应用程序中硬编码路径。
Symfony2非常好,在编写API时绝对有用。但是,如果您不想处理序列化/反序列化,您可以http://laravel.com/尝试一下。它是基于symfony构建的,您可以动态生成一个api。