最佳实践以及如何在Symfony2中从iOS AFNetworking中查找获取POST数据并在get中返回JSON


Best Practices and how to find get POST data from iOS AFNetworking in Symfony2 and return JSON in GET?

我正在构建一个移动应用程序(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。