2012-12-25 43 views
0

我目前正在使用Symfony2和FOSRestBundle一起使用RESTful API。FOSRestBundle和Mongodb遊標對象json

我喜歡Mongodb,所以我實現了這一點,這裏是我的usercontroller的一個片段。

/** 
    * @return View view instance 
    * @View() 
    */ 
    public function allAction() { 
    $users = $this->get('doctrine_mongodb') 
     ->getRepository('FantasytdUserBundle:User') 
     ->findByUsername('Elvar'); 

    return $users; 
    } 

所以我在數據庫中找到一個用戶,這會產生一個結果。這是用MySQL數據庫完成這段代碼將工作。但是對於mongodb,get方法返回一個Cursor對象,當它返回時,你會得到類似的東西。

[{"message":"[Semantical Error] Annotation @Secure is not allowed to be declared on class JMS\\SecurityExtraBundle\\Annotation\\Secure. You may only use this annotation on these code elements: METHOD.","class":"Doctrine\\Common\\Annotations\\AnnotationException","trace":[{"namespace":"","short_class":"","class":"","type":"","function":"","file":"\/Users\/Elvar\/Projects\/fantasytd\/backend\/vendor\/doctrine\/common\/lib\/Doctrine\/Common\/Annotations\/AnnotationException.php","line":52,"args":[]}, 

然後繼續。

我應該如何處理這些遊標對象?

+0

如果您嘗試使用'Secure(roles =「ROLE_ADMIN」)'註釋來確保整個控制器的安全,則會在Symfony 2.1中引發錯誤。使用'@PreAuthorize(「hasRole('ROLE_ADMIN')」)'代替(參見:http://stackoverflow.com/a/12001097/601386)。 – flu

+0

如果您使用@PreAuthorize,請不要忘記在'jms_security_extra:'下爲您的配置添加'expressions:true'。它默認爲'false'。 – flu

回答

2

顯然,如果結果只產生一個結果,它就會起作用,因此使用FindOneByUsername()可以解決問題。

如果你需要多個結果,我通過循環來解決它。

public function allAction() { 
    $usersQ = $this->get('doctrine_mongodb') 
     ->getRepository('FantasytdUserBundle:User') 
     ->findByUsername('Elvar'); 

    foreach ($usersQ as $user) { 
     $users[] = $user; 
    } 

    return $users; 
    } 
1

而是通過與foreach循環列表中運行,我們正在使用的「 - >指定者()」光標對象 - 它只是一個簡單一點。 我相信iterator_to_array()也應該這樣做。