2012-01-11 40 views
0

我有很多使用方法如何避免Zend重定向方法中的字符串重複?

$this->_redirect('/controller_name/action_name'); 

重定向到數據處理後,其他動作控制器和動作的一個Zend項目。我觀察到,這創造了很多「不可思議的字符串」,這會傷害DRY原則:如果我更改控制器或操作名稱,則必須在使用它的所有操作中更改此重定向代碼。我想知道Zend是否有更好的方法來避免這種情況。我想過爲所有控制器和動作名稱創建常量,如下所示:

$this->_redirect(HOME_CONTROLLER_INDEX); 

但我認爲這種方法不是很好。有更好的解決方案嗎?

+0

你能詳細說明爲什麼你不想使用'定義()'?這似乎是一個不錯的主意。 – jprofitt 2012-01-11 13:36:29

+0

我認爲這會污染太多常量的命名空間,比已經多。 – Karlisson 2012-01-11 13:39:43

+0

如果沒有定義,那麼一些延伸,我會說。擴展控制器(不推薦)或者創建一個動作助手(你必須重寫很多當前的重定向),它將接受一個字符串鍵(比如'HOME_CONTROLLER_INDEX'),然後使用它的內部查找表來查看哪個URL這應該重定向到。您必須僅維護和更新查找表。 – bububaba 2012-01-11 13:45:02

回答

1

你可以使用常量,而不是

class DefaultController extends Zend_Controller_Action { 
    const IndexAction = '/controller/action/'; 

    ... 
    $this->_redirect(DefaultController::IndexAction); 
} 

或者SplEnum。見:http://www.php.net/manual/de/class.splenum.php

+0

這工作得很好,但我必須在application.ini中放入includePaths.controllers指令。 – Karlisson 2012-01-11 14:38:09

1

如果你不打算修改你的路由器(因爲你使用的是「編譯的」url),你可以選擇定義常量。

$this->_redirect('/controller/action'); 

否則,您可以依靠一些調用redirector動作助手的私有方法。

public function redirectControllerAction() 
{ 
    $this->_helper->redirector('action', 'controller'); 
} 

這樣,您可以將所有重定向本地化爲您的controllers

如果您將來需要維護您的代碼,您可以將所有具體的重定向組合在一起,並且不會用許多可能會妨礙可讀性並使其維護複雜的常量來隱藏代碼。

您也可以使用控制器方法使用flash messenger向用戶發送消息,而不需要太多努力。

public function redirectControllerAction() 
{ 
    $this->_helper->flashMessenger('You have been redirected to a better location'); 
    $this->_helper->redirector('action', 'controller'); 
} 
0

對於目標控制器名稱,你可以添加此靜態方法:

public static function getName() { return __CLASS__; } 

(您需要添加代碼以刪除控制器後綴,並呼籲Zend_Filter_Word_xxx執行拐點)

和像這樣使用它:

$this->_redirect('/'.DefaultController::getName().'/action_name');