[英]Zend Framework: Controllers in separate directories
我在Zend框架中還很陌生,但是很快就會學習。 我遇到了以下問題,但是我真的不知道我的解決方案是否很好:)
我創建了一個使用小部件的應用程序。 Widget是實現Widget_Interface的類,並由Widget_Manager執行。
可以通過WidgetController
(調用Widget_Manager等)來加載小部件。 現在我遇到的問題是:還可以配置窗口小部件,並使代碼更加透明,我希望窗口小部件具有自己的控制器(當前,它只是一個類)。 但是問題是,我希望所有窗口小部件配置都可以通過WidgetController
,然后傳遞給特定的窗口小部件控制器。
一個例子:假設我有一個名為“ scrobbler”的小部件。 現在,當在UI中配置它時,我想使用更新的設置發出Ajax請求。 我可以發出類似http://myapp.com/scrobbler/update-info/
的請求,這樣框架將運行ScrobblerController
然后從這里開始處理信息。 我的想法是在http://myapp.com/widget/update/scrobbler/
上發出請求,因此該框架運行WidgetController
。 WidgetController
然后會叫ScrobblerController
,並通過其它參數。
我知道Zend_Controller
的_forward()
函數,但我想將小部件控制器和我的應用程序的控制器分隔開(例如/ application / controllers中的應用程序控制器和/ application / controllers / widgets中的小部件控制器)。
是否可以做到這一點,我必須在Zend框架配置中添加什么? 希望我不要太復雜了:)
好天氣
編輯:使用模塊化結構解決了此問題,並將普通類移到了根目錄中。
在這種情況下,您可能使用了控制器助手而不是控制器。 因此,假設WidgetController負責更新所有類型的小部件。 updateAction
需要找到有關您希望配置的窗口小部件類型的信息,這是scrobbler
參數。 您需要命名此參數,以便可以輕松訪問它。 這可以通過在uri中的scrobbler
之前添加route
或添加名稱來完成。
解決方案1 :添加路線:
在引導程序中:
public function __initRoutes () {
$route = new Zend_Controller_Router_Route(
'widget/update/:type',
array (
'controller' => 'widget',
'action' => 'update'
),
array (
'type' => '[a-z_-]*'
)
);
/* @var $fc Zend_Controller_Front */
$fc = $this->bootstrap('FrontController')->getResource('FrontController');
/* @var $router Zend_Controller_Router_Rewrite */
$router = $fc->getRouter();
$router->addRoute('update-widget', $route);
}
解決方案2 :在uri中添加參數名稱:
向/widget/update/type/widgetName
。
現在,在WidgetController :: updateAction中,您可以使用$this->_getParam('type')
this- $this->_getParam('type')
獲取要更新的小部件。
因此,代碼可能類似於:
class WidgetController extends Zend_Controller_Action
{
public function updateAction ()
{
$widgetName = $this->_getParam('type');
$this->view->result = $this->_helper->Widgets->update($widgetName);
}
}
class App_Controller_Helper_Widgets extends Zend_Controller_Action_Helper
{
public function update($widgetName)
{
$widgetManager = new App_Model_WidgetManager();
$widget = $widgetManager->load($widgetName);
$widget->setOptions($this->getRequest()->getParams());
return $widget->save();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.