我在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
并传递其他参数。
我知道_forward()
中的Zend_Controller
函数,但我希望将widget控件和我的应用程序的控制器分开(比如/ application / controllers中的应用程序控制器和/中的widget控件)应用/控制器/窗口小部件)。
是否有可能实现这一点以及我必须添加到Zend框架配置中?希望我没有太多复杂化:))
美好的一天
修改 使用模块化结构解决了这个问题,并将公共类移动到根目录中。
答案 0 :(得分:0)
在这种情况下,你可能会使用Controller助手而不是控制器。所以我们假设WidgetController负责更新所有类型的小部件。 updateAction
需要查找有关您要配置的窗口小部件类型的信息,这是scrobbler
参数。您需要为此参数命名,以便轻松访问它。这可以通过在uri中添加route
或在scrobbler
之前添加名称来完成。
解决方案1 :添加路线:
在Bootstrap中:
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')
获取要更新的小部件。
因此代码看起来像:
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();
}
}