2012-01-12 13 views
6

Obecnie mam zwykłą strukturę kontrolera/działania:Symfony2: Najprostszym sposobem, aby dostać relaksującego adresy URL

BlogController:

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

I PostController

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

Chciałbym to adres URL w widoku szczegółowym posta na blogu:

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

Wiem, że istnieje RESTBundle, ale jest to nadmierne komplikowanie rzeczy IMO i jest kilka prawdziwych problemów z trasami i walidacją form, których nie byłem w stanie rozwiązać (nawet z pomocą facetów na IRCu). Nie potrzebuję punktów dostępowych dla JSON, serializerów, widoków specjalnych itp., Po prostu potrzebuję sposobu, aby jakoś sterować układami.

Czy ktoś może mi w tym pomóc?

+0

Co pytasz sprawia żadnego logicznego sens. Nie możesz mieć dwóch kontrolerów, które przetwarzają żądanie, a następnie zwracają odpowiedź. Możesz ** przekazać go do "BlogController", a następnie przesłać dalej do "PostController", ale lepiej byłoby użyć jednego kontrolera i uczynić go odpowiedzialnym za wszelkie działania. – JamesHalsall

+0

@Jaitsu Nie pytam o sposób obsługi jednego żądania z wieloma kontrolerami. Nie obchodzi mnie, jak działa routing. Potrzebuję struktury URL RESTful i sposobu na strukturę kontrolerów, tak aby blogi mogły być obsługiwane przez BlogController, a poczta może być obsługiwana przez PostController – stoefln

+0

I źle zrozumiałem pierwotne pytanie. Na czym polega problem polegający na zdefiniowaniu dwóch oddzielnych tras? – JamesHalsall

Odpowiedz

0

zainstalowałem RestBundle, po kilka godzin zabawy usunąłem go ponownie, ze względu na brak elastyczności połączeń (przynajmniej ja nie dowiedzieć się, jak ustawić trasy odpowiednio).

Potem ustawić trasy podobnie jak w typowych regulatorów. Więc dodałem routingu adnotacji tak:

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

I:

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

Ważne: musisz zawierać PostController przed BlogController w konfiguracji routingu

+0

wygląda znajomo ... – maiwald

+0

@maiwald: tak, wiem, nic specjalnego. Miałem nadzieję na bardziej "eleganckie" rozwiązanie. Dodałem jednak kilka linii tylko w celu zapewnienia kompletności. – stoefln

8

To nie odpowiada na konkretne pytanie, ale chciałem polecić bardziej przejrzysty projekt adresu URL, który jest bardziej UTRZYMUJĄCY.

Aby pracować z blogami ogólnie, należy wejść w interakcję z zasobem podstawowym /blogs.

POST /blogs do utworzenia bloga.

GET /blogs aby wyświetlić wszystkie blogi.

Aby pracować z konkretnym blogiem, należy określić, który blog. Aby uzyskać szczegółowe informacje na temat konkretnego bloga, należy uzyskać

GET /blogs/:id.

Teraz możesz określić, z których sub-źródeł blogów chcesz się komunikować.

POST /blogs/:id/posts, aby utworzyć nowy wpis.

GET /blogs/:id/posts/:id, aby uzyskać szczegółowe informacje na temat konkretnego wpisu na konkretny blog.

+0

Dzięki tobie, to ma sens – stoefln

0

Nie możesz po prostu mapować trasy z dwoma parametrami do akcji szczegółowej?

Używamy adnotacji dla naszych tras, więc to, co wiem :) Ale przypuszczam, że jego sens jest taki sam dla wszystkich metod.

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

do „problemu”, to jest to, że trzeba sprowadzić blog Poczty, aby przejść dwa argumenty do pomocnika URL podczas wyświetlania linków do niej, a nie tylko sam słupek. Ale nie sądzę, że istnieje jakakolwiek inna droga.

Szczegółowa akcja musi sprawdzić, czy podany adres URL jest prawidłowy. Wątpię, że sf2 zrobi to za ciebie.

+1

Jest to rzeczywiście możliwe. Problem polega na tym, że masz cały kod w jednym kontrolerze. Chcę, aby PostController obsługiwał wiadomości post i BlogController, aby robić blogi. – stoefln

+0

bardzo prawdziwe. i chciałbym wiedzieć, jak to zrobić sam! – maiwald

Powiązane problemy