Symfony2如何重定向到没有硬编码路由名称的操作?

gre*_*emo 4 symfony

我有一个抽象的 CRUDController延伸Controller.在我的newAction成功,我想重定向到showAction($slug)使用redirect方法:

return $this->redirect($this->generateUrl($route, $params));
Run Code Online (Sandbox Code Playgroud)

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)
    }

}
Run Code Online (Sandbox Code Playgroud)

路线的一个例子:

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
Run Code Online (Sandbox Code Playgroud)

Dan*_*iro 11

您可以使用OO的整个概念,并getRouteName()抽象类中调用一个接口方法:

abstract public function getRoute();
Run Code Online (Sandbox Code Playgroud)

然后,在您的具体类或子类UserController上,您只需覆盖并实现:

public function getRoute()
{
    return 'whatever:Route:YouWant';
}
Run Code Online (Sandbox Code Playgroud)

因此,当您在抽象类中调用实际的接口方法时,OO将处理像魔术一样的所有内容:

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

也许尝试一下,如果工作正确,请告诉我们.