我有抽象 CRUDController
扩展Controller
。在我的newAction
中,我成功了,我想使用showAction($slug)
方法重定向到redirect
:
return $this->redirect($this->generateUrl($route, $params));
但newAction
实际上是在子类 UserController
中调用的,因此我无法在$route
中指定路由名CRUDController
。< / p>
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
答案 0 :(得分:11)
您可以使用OO的整个概念,并在抽象类中使用名为getRouteName()
的接口方法:
abstract public function getRoute();
然后,在您的具体类或子类UserController上,您只需覆盖并实现:
public function getRoute()
{
return 'whatever:Route:YouWant';
}
因此,当你的抽象类调用实际的接口方法时,OO会像魔术一样处理所有事情:
public function newAction(Request $request)
{
...
return $this->redirect($this->generateUrl($this->getRouteName(), $params));
}
也许尝试一下,如果工作正确,请告诉我们。
答案 1 :(得分:0)
当我需要在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));
}