6

我的 Codeigniter 2.1.0 应用程序中有这个错误控制器:

<?php

class Error extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        set_status_header(404);
        $data->menuItems = Main::_menu();
        $data->title = "404 error !";
        $data->pageview = 'templates/404';
        $this->load->view('templates/main', $data);
    }

    public function facebook()
    {

        set_status_header(404);            
        $data->menuItems = Main::_menu();
        $data->title = "Facebook error !";
        $data->pageview = "templates/facebook_error";
        $this->load->view('templates/main', $data);
    }
}
?>

主控制器 _menu:

<?php
class Main extends CI_Controller
{
    // ...  a lot of methods here ...
    public static function _menu()
    {
            static $menuItems = array( //just a simple array
                                     );
    }
}
?>

facebook() 方法与 index() 完全一样,但是 index 工作正常,facebook() 抛出这个消息:

Fatal error: Class 'Main' not found in /var/www/MYApplicationName/application/controllers/error.php on line 22

地球怎么可能?我怎样才能Main::_menu()从 facebook() 方法到达?

4

4 回答 4

1

从另一个控制器调用函数会破坏 MVC 并将您置于 HMVC 领域。

如果您确实需要这样做,请查看此线程以及 CodeIgniter 的模块化扩展 (HMVC) 插件。

于 2012-08-15T16:49:27.917 回答
1

为什么不创建 MY_Controller 来扩展 CI_Controller 您放置可重用代码的位置?

于 2012-08-18T19:40:37.663 回答
1

实际上 - 你错了。您的“索引”代码也不起作用。

我刚刚将您上面的所有代码粘贴到 CI 2.1.2 的干净版本中,索引函数也返回相同的错误。

因此,也许您的计算机缓存了某些内容,或者您​​在其他地方有一些其他代码让您认为它正在工作。但它不起作用。

无论如何-真正的问题是您为什么要尝试从另一个控制器调用控制器?这不是一个好的 MVC 方法。您的“_menu()”函数应该位于一个中——这是它所属的地方。

或者将 _menu() 代码放入“MY_Controller”并让两个控制器扩展MY_Controller

或者将 _menu() 代码放入helper中。

基本上有三种更好的方法可以解决这个问题。

于 2012-08-19T04:37:13.867 回答
1

根据@TheShiftExchange 的回答,我能够追踪到路线设置导致了这种行为。我的config/routes.php样子是这样的:

$route['404_override'] = 'error/index';
$route['(:any)'] = "main/$1";

www.example.com/nonexistent-url所以,当我向控制器发出请求时main,CI 注意到没有这样的方法,所以它也运行error/index了,但是main控制器已经加载了。

另一种方法facebook是从 only 的现有方法重定向的main,例如gallery,这种方式就像我转到 url 一样www.example.com/error/facebook,因此main未加载控制器,因为仅error/facebook请求了。如果我调用www.example.com/error/index它,它的工作原理是一样的,因为在这种情况下,main控制器没有加载,只有error.

(赏金去了@TheShiftExchange,因为他的回答是最准确的,并为我提供了能够追踪问题的最佳信息。谢谢!
我的重定向之一从未到达,我认为这是错误/索引页面。)

于 2012-08-19T08:37:37.523 回答