Zend Framework:控制器位于不同的目录中

时间:2010-12-20 13:24:24

标签: php zend-framework

我在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框架配置中?希望我没有太多复杂化:))

美好的一天

修改 使用模块化结构解决了这个问题,并将公共类移动到根目录中。

1 个答案:

答案 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();
  } 
}