2015-10-12 9 views
7

haben Ich habe drei Controller namens BlogController, PostController, CommentController dass CommentController ist Unter Ressource von PostController und PostController Unterressource von 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 

Ich definiere getAction Methoden, aber ich bekomme folgende Fehlermeldung:

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

Edit:

Ich versuche auch, die sich ändern Name der Methode zu getCommentAction($commentId), getPostAction($postId) und getBlogAction, aber es funktioniert nicht. Wenn ich @RouteResource Annotationen verwende, muss der Methodenname getAction($id) sein, sonst funktioniert es nicht.

Wenn ich Eltern von mgh_blog_post_comment Router zu mgh_blog ändern, funktioniert es!

+0

Können Sie bitte die Ausgabe des Befehls 'app/console debug: router' posten? – giosh94mhz

+0

@ giosh94mhz 'debug: router' dump' InvalidArgumentException' Fehler – ghanbari

+0

Das ist der gleiche Fehler, den Sie auf dem Webserver bekommen. Sie müssen die fehlerhafte Route auskommentieren und den Befehl ausführen. Auf diese Weise kann ich sehen, welche Route stören könnte (falls vorhanden) – giosh94mhz

Antwort

5

Die Fehlerbeschreibung ist schrecklich und eine große Zeitverschwendung, weil es sagt dir nicht, was das eigentliche Problem ist. Versuchen Sie Folgendes:

/** 
* @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) 
    { 
    ... 
    } 
} 

Sie hatten nicht die richtige Anzahl von Argumenten in den Nachfahren Controller-Aktionen. Ich brauchte zwei Tage, um das Problem zu lösen.

Die Mutter Route, Blog, wie folgt aussieht:

/blog/{blogUri} 

Es

public function getAction($blogUri) 

Das Kind Route übereinstimmen, Post, sieht so aus:

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

Es wird nicht passen Sie den folgenden Code an, da er zwei Parameter benötigt.Das gleiche gilt für die Enkel - die für die drei Parameter suchen:

public function getAction($postId) 

der Enkel Weg, Kommentar, wie folgt aussieht:

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

Die Codespur der Vorfahren jeden Controllers hält. Der Beitrag hat 1 Vorfahren. Beim Erstellen der Routen für den Post-Controller untersucht der Code die Anzahl der Parameter in der 'get-Aktion'. Es nimmt die Anzahl der Parameter und subtrahiert die Anzahl der Vorfahren. Wenn der Unterschied nicht gleich eins ist, wird der Fehler ausgegeben.

Fazit, für jeden Nachkommen muss es die ID-Parameter seiner Vorfahren und eine eigene ID enthalten. Es sollte immer einen Parameter mehr geben als Vorfahren.

+1

danke Mann, du bist mein Held – ghanbari

+1

Ich weiß, wie du dich fühlst. Ich habe es herausgefunden, nachdem ich 2 Tage lang den Code durchkämmt habe. Ich plane, eine bessere Fehlerbeschreibung zu schreiben und eine Pull-Anfrage zu machen. – dlporter98

1

Haben Sie versucht ?:

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

ja, ich benutze es, aber es funktioniert nicht – ghanbari

+0

siehe bitte meinen Beitrag, ich aktualisiere es – ghanbari

+1

Das Problem ist die Anzahl der Argumente in der Singular get Aktion des Nachkommen Controller. Siehe meine Antwort für Details. – dlporter98

1

Versuchen:

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

Dies ist mein Controller Beispiel:

<?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

Ich habe 'cgetAction' Methode, dieses Problem ist nicht von' cgetAction', wie ich in Frage, die brauchen 'get {SINGULAR} Action ($ ID)' Methode – ghanbari

+0

Die Singular ist nur: öffentliche Funktion getAction (Request $ Anfrage , $ id) { } –

+0

danke für Hilfe, definierte ich diese Methode, ich denke, fos kann nicht mit Multi-Level-Sub-Ressource umgehen – ghanbari