在Symfony2中使用解析查询时的Doctrine注释异常

时间:2014-10-23 19:56:39

标签: rest symfony doctrine-orm parse-platform symfony-2.5

我尝试使用Parse作为云数据库在Symfony2中创建API Rest。

如果我尝试检索Parse用户,它可以正常工作并返回预期的数据。

本地网址示例:http://www.foo.local/app_dev.php/getUsers/

以下是我在Users控制器中使用的代码(我使用注释来设置控制器中的路由):

namespace Foo\ApiBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FOS\RestBundle\Controller\Annotations\View;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Parse\ParseClient;
use Parse\ParseObject;
use Parse\ParseQuery;
use Parse\ParseUser;

class UsersController extends Controller
{
    /**
    * @return array
    * @View()
    * @Route("/getUsers/")
    */
    public function getUsersAction(Request $request) {
        ParseClient::initialize(<my Parse keys>);

        $query = ParseUser::query();     
        $results = $query->find();

        return array('users' => $results);
    } 
}

但是,如果我尝试使用我的Products ParseObjects,我会收到以下错误消息:

  

错误代码=&#34; 500&#34; message =&#34;内部服务器错误&#34;例外   类=&#34;学说\共同\注解\ AnnotationException&#34;   message =&#34; [语义错误]注释&#34; @返回&#34;在方法中   从未导入Parse \ ParseFile :: getData()。你有没有忘记?   添加&#34;使用&#34;这个注释的陈述?&#34;

本地网址示例:http://www.foo.local/app_dev.php/getProducts/

产品控制器代码:

namespace Foo\ApiBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FOS\RestBundle\Controller\Annotations\View;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Parse\ParseClient;
use Parse\ParseObject;
use Parse\ParseQuery;
use Parse\ParseUser;
use Parse\ParseFile;

class ProductsController extends Controller 
{
    /**
     * @return array
     * @View()
     * @Route("/getProducts/")
     */
    public function getProductsAction(Request $request) {
        ParseClient::initialize(<my Parse keys>);

        $query = new ParseQuery("Products");
        $results = $query->find();

        return array('products' => $results);    
    }
}

如果不是返回$results而是返回其他虚拟数据,例如return array('products' => 'fooProducts'),我将不再收到错误消息。

此外,如果我创建var_dump变量的$results,我会获得预期的ParseObjects数组。

这是我的routing.yml文件,以防它出现问题:

api:
    resource: "@FooApiBundle/Controller/"
    type:     annotation
    prefix:   /

users:
    type: rest
    resource: Foo\ApiBundle\Controller\UsersController

products:
    type: rest
    resource: Foo\ApiBundle\Controller\ProductsController

通过错误消息,似乎问题与Doctrine有关,但由于我没有使用它,我不确切地知道如何发生冲突或如何解决它。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

@returns类中有一些Parse\ParseFile的DocBlock拼写错误导致Doctrine的Annotations类尝试将它们标识为类。这不是你的错,而是Parse PHP SDK库中的一个错误。

made a fix in this commit并向原始开发者提交了一个拉取请求,因此最终运行composer update以使您的Parse库达到最新的正确版本应该是一件简单的事。

You can read more about DocBlock and the part specifically on Annotations here

以下是src/Parse/ParseFile.php生成的差异的复制/粘贴:

@@ -31,7 +31,7 @@ class ParseFile implements \Parse\Internal\Encodable
   /**
    * Return the data for the file, downloading it if not already present.
    *
-   * @returns mixed
+   * @return mixed
    *
    * @throws ParseException
    */
 @@ -50,7 +50,7 @@ public function getData()
   /**
    * Return the URL for the file, if saved.
    *
-   * @returns string|null
+   * @return string|null
    */
   public function getURL()
   {
 @@ -112,7 +112,7 @@ public function getMimeType()
    * @param string $name The file name on Parse, can be used to detect mimeType
    * @param string $mimeType Optional, The mime-type to use when saving the file
    *
-   * @returns ParseFile
+   * @return ParseFile
    */
   public static function createFromData($contents, $name, $mimeType = null)
   {
 @@ -132,7 +132,7 @@ public static function createFromData($contents, $name, $mimeType = null)
    * @param string $name Filename to use on Parse, can be used to detect mimeType
    * @param string $mimeType Optional, The mime-type to use when saving the file
    *
-   * @returns ParseFile
+   * @return ParseFile
    */
   public static function createFromFile($path, $name, $mimeType = null)
   {

答案 1 :(得分:0)

使用Symfony初始化Parse的正确方法是在控制器的setContainer方法上:

class BaseController extends Controller
{
    ....

    public function setContainer(ContainerInterface $container = null)
    {
        parent::setContainer( $container );
        ParseClient::initialize( $app_id, $rest_key, $master_key );
    }
}

根据您的需要,您可以创建一个BaseController并将其扩展到其余的控制器中。

class UsersController extends Controller 

此外,您可以在parameters.yml文件中添加密钥。

parameters:
    #your parameters...
    ParseAppId: your_id
    ParseRestKey: your_rest_key
    ParseMasterKey: your_master_key
  

提示:请注意,您可以添加具有不同Parse项目(开发和发布   版)。在不同的参数中添加参数   配置提供了一种处理此问题的简便方法。

class BaseController extends Controller
{
    ....

    public function setContainer(ContainerInterface $container = null)
    {
        parent::setContainer( $container );
        $app_id = $container->getParameter('ParseAppId');
        $rest_key = $container->getParameter('ParseRestKey');
        $master_key = $container->getParameter('ParseMasterKey');
        ParseClient::initialize( $app_id, $rest_key, $master_key );
    }
}