2010-12-20 54 views
2

我在Zend框架中很新,但很快就学会了。我遇到以下问题,但我不知道我的解决方案是否良好:)Zend Framework:独立目录中的控制器

我已经创建了一个使用小部件的应用程序。 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/上提出请求,所以框架运行WidgetControllerWidgetController然后会调用ScrobblerController并传递其他参数。我想知道Zend_Controller中的_forward()函数,但我希望将小部件控制器和我的应用程序的控制器分开(假设/ application/controllers中的应用程序控制器和/ application/controllers/widgets中的小部件控制器)。

是否有可能做到这一点,我有什么要添加到Zend框架配置?希望我没有复杂太多了:)

尼斯一天

编辑: 解决了这个采用模块化结构,搬到普通班到根目录下。

+0

你利用在 -directory与所有控制器模块或默认配置? – PatrikAkerstrand 2010-12-20 13:45:51

+0

我不使用模块。我刚刚搜索互联网,发现模块可能是解决我的问题的方法。现在的问题是,你可以简单地访问一个模块中的模型并在另一个模块中使用它们吗? – usoban 2010-12-20 13:50:42

回答

0

在这种情况下,您可能会使用Controller helper而不是控制器。假设WidgetController负责更新所有类型的小部件。 updateAction需要找到您想要配置的窗口小部件类型的信息,这是scrobbler参数。您需要命名该参数,以便轻松访问它。这可以通过在uri中添加route或在scrobbler之前添加名称来完成。

解决方案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')更新。

因此,代码可能看起来是这样的:

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(); 
    } 
} 
+0

第一种解决方案可行,但我仍然希望看到小部件控制器将处于分离的目录中。 第二个解决方案没有提供很大的灵活性,因为小部件不仅会更新,还会为不同的请求创建不同的输出,所以我不知何故真的需要完整的控制器类。 – usoban 2010-12-20 15:15:56

相关问题