【问题标题】:Call Modules Controller from Application Bootstrap从应用程序引导调用模块控制器
【发布时间】:2013-02-11 09:54:24
【问题描述】:

我以前曾问过这样的问题,但我认为这是不同的(那只是一个一般性问题)。

我实现了 Zend_Navigation。

对于菜单,我使用 DB Table 来存储菜单项,并在 Array-s 上进行递归以获得菜单项树。

所有这些操作都发生在我的名为 Menu 的模块中。里面我有:

Menu -- 
       Controllers --
                     IndexController.php
       Models--
               DbTable--
                        Menu.php
       Bootstrap.php

在索引控制器里面我有一个function menuGenerator($menu_id)

因此,按照 Zend_Navigation 的教程,菜单在应用程序引导程序中初始化。

我在应用程序引导程序中的函数如下所示:

public function _initMenus() {

    $menuArray = new Menu_IndexController();
    $outArray = $menuArray->menuGenerator(1);

    $mainmenu = new Zend_Navigation($outArray);

    $this->view->navigation($mainmenu);     

}

它给了我一个错误:

Fatal error: Class 'Menu_IndexController' not found in D:\Server\xampp\htdocs\project\application\Bootstrap.php on line 8

那么,我应该如何让它正常工作?

附:是否可以一次启动 2 个新菜单?例如:我需要 1. 主菜单 2. 页脚菜单(任何文章链接都很好)

【问题讨论】:

    标签: zend-framework bootstrapping zend-navigation zend-application


    【解决方案1】:

    默认情况下,Zend Framework 的自动加载器不会像加载其他组件(模型、视图助手、表单等)一样自动加载控制器,因此 PHP 会抛出错误,说它找不到类。解决这个问题的最快方法是在 Bootstrap.php 中明确包含控制器。以下应该有效:

    public function _initMenus() {
    
        require_once('./Controllers/IndexController.php');
        $menuArray = new Menu_IndexController();
        $outArray = $menuArray->menuGenerator(1);
    
        $mainmenu = new Zend_Navigation($outArray);
    
        $this->view->navigation($mainmenu);     
    
    }
    

    【讨论】:

    • 下一个错误:可捕获的致命错误:传递给 Zend_Controller_Action::__construct() 的参数 1 必须是 Zend_Controller_Request_Abstract 的一个实例,没有给出,在 D:\Server\xampp\htdocs\project\application\ 中调用第 9 行的 Bootstrap.php 并在第 127 行的 D:\Server\xampp\htdocs\project\library\Zend\Controller\Action.php 中定义
    • 啊,是的。尝试像这样实例化控制器: $menuArray = new Menu_IndexController( new Zend_Controller_Request_Simple(), new Zend_Controller_Response_Http() );
    【解决方案2】:

    在引导期间调用控制器方法是非常不寻常的,因为控制器操作依赖于许多引导任务。在你的情况下,控制器方法menuGenerator() 实际上不是一个action,所以大概不会有问题。

    尽管如此,我将menuGenerator() 方法移到它自己的类中仍然很不寻常。然后在 Bootstrap 和控制器中调用该操作。

    【讨论】:

    • 是的,我知道在这种情况下它不是一个动作。问题是我正在调用模型从数据库中获取数组,所以你建议我把它带到我的自定义命名空间库并从那里加载它?
    • 是的。或者在application/services/ 内的服务类中。关键是将功能移动到引导程序和控制器都可以轻松调用它的地方。
    猜你喜欢
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2011-07-22
    相关资源
    最近更新 更多