2015-10-12 12 views
7

Ho tre controllore nominato BlogController, PostController, CommentController che CommentController è sub risorsa PostController e PostController risorsa secondaria di BlogController.

/** 
* @Rest\RouteResource("blog", pluralize=false) 
*/ 
class BlogController extends FOSRestController 
{ 
    public function getAction($blogUri) 
    { 
    ... 
    } 
} 

/** 
* @Rest\RouteResource("post", pluralize=false) 
*/ 
class PostController extends FOSRestController 
{ 
    public function getAction($postId) 
    { 
    ... 
    } 
} 

/** 
* @Rest\RouteResource("comment", pluralize=false) 
*/ 
class CommentController extends FOSRestController 
{ 
    public function getAction($commentId) 
    { 
    ... 
    } 
} 

routing.yml

mgh_blog: 
    resource: MGH\BlogBundle\Controller\BlogController 
    type:  rest 

mgh_blog_post: 
    resource: MGH\BlogBundle\Controller\PostController 
    type:  rest 
    parent: mgh_blog 

mgh_blog_post_comment: 
    resource: MGH\PostBundle\Controller\CommentController 
    type:  rest 
    parent: mgh_blog_post 

mi definiscono getAction metodi, ma ottengo errore seguente:

[InvalidArgumentException]           
    Every parent controller must have `get{SINGULAR}Action($id)` method 
    where {SINGULAR} is a singular form of associated object 

Edit:

cerco anche di cambiare la nome del metodo su getCommentAction($commentId), getPostAction($postId) e getBlogAction, ma non funziona.

Quando si utilizzano le annotazioni @RouteResource, il nome del metodo deve essere getAction($id), altrimenti non funziona.

Quando cambio genitore del router mgh_blog_post_comment su mgh_blog, funziona!

+0

Puoi pubblicare l'output del comando 'app/console debug: router'? – giosh94mhz

+0

@ giosh94mhz 'debug: errore' dump errore 'InvalidArgumentException' – ghanbari

+0

Questo è lo stesso errore che si ottiene sul server web. È necessario commentare la rotta incriminata, quindi eseguire il comando. In questo modo, posso vedere quale percorso può interferire (se c'è) – giosh94mhz

risposta

5

Tale descrizione di errore è terribile e una grande perdita di tempo, perché non ti dice quale sia il vero problema. Provare quanto segue:

/** 
* @Rest\RouteResource("blog", pluralize=false) 
*/ 
class BlogController extends FOSRestController 
{ 
    public function getAction($blogUri) 
    { 
    ... 
    } 
} 

/** 
* @Rest\RouteResource("post", pluralize=false) 
*/ 
class PostController extends FOSRestController 
{ 
    public function getAction($blogUri, $postId) 
    { 
    ... 
    } 
} 

/** 
* @Rest\RouteResource("comment", pluralize=false) 
*/ 
class CommentController extends FOSRestController 
{ 
    public function getAction($blogUri, $postId, $commentId) 
    { 
    ... 
    } 
} 

Lei non ha avuto il numero corretto di argomenti nelle azioni di controllo discendenti. Mi ci sono voluti due giorni di debugging per capirlo.

Il percorso genitore, Blog, si presenta come:

/blog/{blogUri} 

Si abbinerà

public function getAction($blogUri) 

Il percorso bambino, Post, si presenta come:

/blog/{blogUri}/post/{postId} 

Sarà non corrisponde al seguente codice perché ha bisogno di due parametri.Lo stesso vale per il nipote - che è alla ricerca di tre parametri:

public function getAction($postId) 

Il percorso nipote, commento, sembra:

/blog/{blogUri}/post/{postId}/comment/{commentId} 

Il codice registra gli antenati di ogni controller. Il post ha 1 antenato. Quando costruisci i percorsi per il post controller, il codice esamina il numero di parametri sul 'get action'. Prende il numero di parametri e sottrae il numero di antenati. Se la differenza non è uguale a uno, genera l'errore.

Conclusione, per ogni discendente, è necessario includere i parametri ID dei propri antenati E il proprio ID. Ci dovrebbe sempre essere un parametro in più rispetto agli antenati.

+1

grazie amico, tu sei il mio eroe – ghanbari

+1

so come ti senti. L'ho capito dopo aver impiegato 2 giorni a sfogliare il codice. Ho in programma di scrivere una descrizione migliore dell'errore e fare una richiesta di pull. – dlporter98

1

Hai provato ?:

class CommentController extends FOSRestController 
{ 
    public function getCommentAction($commentId) 
    { 
    ... 
    } 
} 
+0

sì, lo uso, ma non funziona – ghanbari

+0

per favore vedi il mio post, lo aggiorno – ghanbari

+1

Il numero è il numero di argomenti nella singolare azione del discendente controllori. Vedi la mia risposta per i dettagli. – dlporter98

1

Prova:

public function cgetAction(Request $request) 
{ 
    ... 
} 

Questo è il mio esempio regolatore:

<?php 

namespace Cf\SClinicBundle\Controller; 

use Symfony\Component\HttpFoundation\Request; 
use FOS\RestBundle\Controller\FOSRestController; 
use FOS\RestBundle\Controller\Annotations as Rest; 
use FOS\RestBundle\Controller\Annotations\RouteResource; 
use Cf\SClinicBundle\Entity\CfAcquireImage; 
use Doctrine\DBAL\DBALException as DBALException; 
use Doctrine\ORM\NoResultException as NoResultException; 

/** 
* CfAcquireImage controller. 
* 
* @RouteResource("acquire-image") 
*/ 
class ApiCfAcquireImageController extends FOSRestController 
{ 
    /** 
    * @var array 
    */ 
    public $status; 

    /** 
    * @var 
    */ 
    public $parameter; 

    /** 
    * @var 
    */ 
    private $role_name; 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 

    } 

    /** 
    * Lists all Cf Acquire Image entities. 
    * 
    * @param Request $request 
    * 
    * @return mixed 
    */ 
    public function cgetAction(Request $request) 
    { 

    } 

    /** 
    * Finds a Cf Acquire Image entity by id. 
    * 
    * @param Request $request 
    * @param   $id $id 
    * 
    * @return array 
    */ 
    public function getAction(Request $request, $id) 
    { 

    } 

    /** 
    * Create a new Cf Acquire Image entity. 
    * 
    * @param Request $request 
    * 
    * @return mixed 
    */ 
    public function postAction(Request $request) 
    { 

    } 

    /** 
    * @param Request $request 
    * @param   $id 
    * 
    * @return array 
    */ 
    public function putAction(Request $request, $id) 
    { 

    } 

    /** 
    * Deletes a Cf Acquire Image entity. 
    * 
    * @param Request $request 
    * @param   $id 
    * 
    * @return mixed 
    */ 
    public function deleteAction(Request $request, $id) 
    { 

    } 
} 
+0

ho il metodo 'cgetAction', questo problema non è da' cgetAction' come dico in questione, che richiede il metodo 'get {SINGULAR} Action ($ id)' – ghanbari

+0

Il singolare è solo: funzione pubblica getAction (Richiesta $ richiesta $ id) { } –

+0

grazie per l'aiuto, ho definito questo metodo, penso che fos non può gestire sub risorsa multi livello – ghanbari