Symfony2: самый простой способ получить RESTful URL - PullRequest
6 голосов
/ 13 января 2012

В настоящее время у меня есть обычная структура Контроллер / Действие:

BlogController:

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

И PostController

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

Что мне нужно, так это URL дляподробное представление поста в блоге:

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

Я знаю, что существует RESTBundle, но это слишком усложняет IMO, и есть некоторые реальные проблемы с маршрутами и проверкой формы, которые я не смог решить (даже с помощьюребята на IRC).Мне не нужны точки доступа для JSON, сериализаторов, специальных представлений и т. Д. Мне просто нужен способ как-то укладывать контроллеры.

Может ли кто-нибудь помочь мне с этим?

Ответы [ 4 ]

8 голосов
/ 13 января 2012

Это не отвечает на ваш конкретный вопрос, но я хотел порекомендовать более чистый дизайн URL, который был бы более RESTful.

Для работы с блогами вообще взаимодействуйте с базовым ресурсом /blogs.

POST /blogs для создания блога.

GET /blogs для перечисления всех блогов.

Для работы с конкретным блогом необходимо указать, какой блог.

GET /blogs/:id, чтобы получить подробности для конкретного блога.

Теперь конкретно укажите, с каким подресурсом блогов вы хотите взаимодействовать.

POST /blogs/:id/posts для создания нового сообщения.

GET /blogs/:id/posts/:id для получения сведений о конкретном сообщении для определенного блога.

1 голос
/ 16 января 2012

Думая RESTful, у вас есть два ресурса: блоги и сообщения.

В RESTful-маршруте действие подразумевается http-глаголом.Я понимаю, что вы не в Rails, но эти простые таблицы иллюстрируют "путь Rails" для выполнения вложенных ресурсов REST и RESTful:

http://edgeguides.rubyonrails.org/routing.html#crud-verbs-and-actions

http://edgeguides.rubyonrails.org/routing.html#nested-resources

Очень чисто.

0 голосов
/ 27 января 2012

Я установил RestBundle, поиграв около нескольких часов, я снова удалил его из-за негибкости маршрутов (по крайней мере, я не узнал, как правильно настроить маршруты).

После этого я установил маршруты, как в обычных контроллерах. Поэтому я добавил аннотации маршрутизации так:

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

И

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

Важно: вы должны включить PostController перед BlogController в вашей конфигурации маршрутизации

0 голосов
/ 16 января 2012

Разве вы не можете просто сопоставить маршрут с двумя параметрами в действии детализации?

Мы используем аннотации для наших маршрутов, так что это то, что я знаю :) Но я полагаю, что суть его одинакова для всехметоды.

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

Проблема в том, что вам нужно получить блог поста, чтобы передать два аргумента помощнику URL при отображении ссылок на него, а не только самого поста.Но я не думаю, что есть какой-то другой способ.

Детальное действие должно проверить, что данный URL-адрес действителен.Я сомневаюсь, что sf2 сделает это за вас.

...