我尝试使用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有关,但由于我没有使用它,我不确切地知道如何发生冲突或如何解决它。有什么建议吗?
答案 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 );
}
}