Symfony2 как перенаправить на действие без жесткого кодирования имени маршрута? - PullRequest
4 голосов
/ 15 марта 2012

У меня есть аннотация CRUDController, расширяющая Controller. В моем случае newAction, я бы хотел перенаправить на showAction($slug), используя redirect метод:

return $this->redirect($this->generateUrl($route, $params));

Но newAction действительно вызывается в подклассе UserController, поэтому я не могу указать имя маршрута $route в моем CRUDController.

class UserController extends CRUDController { }

abstract class CRUDController extends Controller
{
    /** @Template */
    public function showAction($slug) { }

    /** @Template */
    public function newAction(Request $request)
    {

        $model = $this->createModel();
        $form  = $this->createForm($this->createType(), $model);

        if('GET' == $request->getMethod())
            return array('form' => $form->createView());

        $form->bindRequest($request);

        if(!$form->isValid()) return array(
            'errors' => $this->get('validator')->validate($model),
            'form'   => $form->createView()
        );

        $em = $this->getDoctrine()->getEntityManager();
        $em->persist($model);
        $em->flush();

        // Success, redirect to showAction($slug)
    }

}

Пример маршрутов:

users_show:
  pattern: /users/show/{slug}
  defaults: { _controller: AcmeSecurityBundle:User:show }
  requirements:
    _method:  GET

users_new:
  pattern: /users/new
  defaults: { _controller: AcmeSecurityBundle:User:new }
  requirements:
    _method:  GET

users_create:
  pattern: /users/new
  defaults: { _controller: AcmeSecurityBundle:User:new }
  requirements:
    _method:  POST

Ответы [ 2 ]

11 голосов
/ 15 марта 2012

Вы можете работать со всей концепцией ОО и иметь интерфейсный метод с именем getRouteName() в вашем аннотация классе:

abstract public function getRoute();

А затем в вашем конкретном классе или подклассе UserController вы просто переопределяете и реализуете это:

public function getRoute()
{
    return 'whatever:Route:YouWant';
}

Поэтому, когда в вашем abstract классе вызывается фактический интерфейсный метод, ОО будет обрабатывать все как магию:

public function newAction(Request $request)
{
    ...
    return $this->redirect($this->generateUrl($this->getRouteName(), $params));
}

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

0 голосов
/ 15 марта 2012

Иногда я создаю псевдоинтерфейс, когда мне нужно выполнить такие действия в sf:

interface specialRedirect
{
    public function specialRedirect($slug);
}

Итак, вы можете сделать что-то подобное в своем абстрактном классе:

public function newAction(Request $request)
{
    // ...
    $this->specialRedirect('user', $slug);
}

public function specialRedirect($slug)
{
    // If you don't want to do anything special, just act like normal
    // Success, redirect to showAction($slug)
}

Но затем в UserController вы расширяете / внедряете интерфейс по своему вкусу:

public function specialRedirect($slug)
{
    //here is where you can specify your route name.
    $route = 'Foo_Bar';
    return $this->redirect($this->generateUrl($route, $params));

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...