2012-01-12 52 views
6

Attualmente ho la consueta struttura Controller/Azione:Symfony2: modo più semplice per ottenere gli URL RESTful

BlogController:

/blog/list 
/blog/create 
/blog/detail/my-blog-hash 

E PostController

/post/create 
/post/detail/my-post-hash 

Quello che vorrei è un URL per il post del blog Visualizza dettagli:

/blog/detail/my-blog-hash/post/my-post-hash 

So che esiste un RESTBundle, ma ciò sta complicando le cose su IMO e ci sono alcuni problemi reali con le rotte e la convalida dei moduli che non sono stato in grado di risolvere (anche con l'aiuto dei ragazzi su IRC). Non ho bisogno di accessi per JSON, serializzatori, viste speciali, ecc., Ho solo bisogno di un modo per impilare i controller in qualche modo.

Qualcuno può aiutarmi con questo?

+0

quello che stai chiedendo non fa alcuna logica senso. Non è possibile avere due controllori che elaborano una richiesta e quindi restituiscono una risposta. Potresti ** passarlo al 'BlogController' e poi inoltrarlo al' PostController', ma saresti molto meglio usare un controller e renderlo responsabile di qualunque azione si intende fare. – JamesHalsall

+0

@Jaitsu Non chiedo un modo per gestire una richiesta con più controller. Non mi interessa come funziona il routing. Quello che voglio è una struttura url RESTful e un modo per strutturare i controller in modo che le cose del blog possano essere gestite dal BlogController e che i post possano essere gestiti dal PostController – stoefln

+0

ho frainteso la domanda originale. Qual è il problema con la semplice definizione di due percorsi separati? – JamesHalsall

risposta

0

Ho installato RestBundle, dopo aver giocato per diverse ore l'ho rimosso di nuovo, a causa della rigidità dei percorsi (almeno non ho trovato come impostare i percorsi di conseguenza).

Successivamente ho impostato i percorsi come nei controller comuni. Così ho aggiunto le annotazioni di routing del genere:

// BlogController 
@ORM\Route("blogs/{blogHash}", name="blog_detail") 
public function detailAction(Blog $blog) 

E:

// PostController 
@ORM\Route("blogs/{blogHash}/post/{postHash}", name="blog_post_detail") 
public function detailAction($blogHash, $postHash) 

Importante: è necessario includere il PostController prima della BlogController nella configurazione di routing

+0

sembra familiare ... – maiwald

+0

@maiwald: sì, lo so, niente di speciale. Speravo in una soluzione più "elegante". Tuttavia, ho aggiunto quelle due linee solo per questioni di completezza. – stoefln

8

Questo non risponde alla tua domanda specifica ma volevo raccomandare un design URL più pulito che è più RESTful.

Per lavorare con i blog in generale interagire con la risorsa di base /blogs.

POST /blogs per creare un blog.

GET /blogs per elencare tutti i blog.

Per lavorare con un blog specifico, specificare quale blog.

GET /blogs/:id per ottenere i dettagli per il blog specifico.

Ora specifica quale sottorapporto dei blog con cui vuoi interagire.

POST /blogs/:id/posts per creare un nuovo post.

GET /blogs/:id/posts/:id per ottenere dettagli di un post specifico per un blog specifico.

+0

Grazie, questo ha senso – stoefln

0

Non puoi semplicemente mappare un percorso con due parametri all'azione dettaglio?

Utilizziamo le annotazioni per i nostri percorsi, quindi questo è quello che so :) Ma suppongo che l'essenza di esso sia la stessa per tutti i metodi.

/** 
* @Route("/blog/{blog_hash}/post/{post_hash}", name="post_detail") 
*/ 

Il 'problema', allora è che si deve andare a prendere blog del post per passare i due argomenti al aiutante URL quando mostrando link ad esso e non solo il post stesso. Ma non penso che ci sia un altro modo.

L'azione di dettaglio deve verificare quindi che l'URL specificato sia valido. Dubito che sf2 lo farà per te.

+1

Questo è davvero possibile. il problema è che hai l'intero codice in un controller. Voglio che il PostController gestisca i post e il BlogController per fare il blog. – stoefln

+0

molto vero. e mi piacerebbe sapere come farlo in modo pulito! – maiwald

Problemi correlati