2012-03-15 75 views
4

我有一個摘要CRUDController延伸Controller。在我newAction,OS能否取得成功,我想用redirect方法來重定向到showAction($slug)Symfony2如何重定向到沒有硬編碼路由名稱的操作?

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

newAction實際上是調用子類中的UserController,所以我不能在我的CRUDController指定路線名稱$route

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 

回答

11

你可以用面向對象的整體概念工作,並在你的抽象類有一個名爲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)); 
} 

也許嘗試,讓我們知道,如果正確的做這項工作。

+0

感謝您的回答,即使它很明顯。如果你看看代碼,你會發現我正在用'createModel()'和'createType()'(它們是抽象的)的方法做同樣的事情。但是隨着路線......改變它也會迫使你改變'getRoute',所以我放棄了這個想法。不管怎麼說,還是要謝謝你。 – gremo 2012-03-15 18:53:20

+1

我想你必須返回 - >「return $ this-> redirect();」 – 2014-03-20 12:09:35

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

} 
+0

謝謝,但作爲對drgomesp的回覆,這不是DRY。此外,路由硬編碼的方法名稱... – gremo 2012-03-15 18:58:24

+0

@Gremo我讀了你的其他問題 - 爲什麼不讓你的抽象控制器詢問它正在處理的服務以獲取有關如何處理響應的信息? – Nick 2012-03-15 20:53:31

+0

你能更好地解釋你的問題嗎?我不確定我能理解 - 謝謝。 – gremo 2012-03-15 21:56:55

相關問題