codeigniter:扩展通用控制器

时间:2011-11-02 14:39:39

标签: codeigniter controller

我已经阅读了有关此问题的所有帖子,但没有任何效果。我在使用Apache2.2和PHP5.3.2的LAMP中使用Codeigniter 2.02

我正在尝试创建一个公共控制器,我的公共控制器将从该控制器继承,因此我可以在那里执行常见任务。

我有这个:

file:parent_controller.php

if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Parent_controller extends CI_Controller {

    public function Parent_controller()
    {
        parent::__construct();
    }

    public function index() {
        echo "Hi!";
    }
}

file:welcome.php

if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Welcome extends Parent_controller {

    public function __construct()
    {
        parent::__construct();
    }
}

我已经尝试了我发现的下一个解决方案,但它们都没有工作:

  • 公共函数__contstruct()而不是公共函数Parent_controller()

  • 父:: Parent_controller();

  • 将parent_controller.php文件放入核心

  • 将parent_controller.php文件放入控制器

  • 将此添加到config / config.php:

    function __autoload($class){
            if (file_exists(APPPATH."(controllers|core)/".$class.EXT)){
                 require_once(APPPATH.'(controllers|core)/'.$class.EXT);
           }
    }
    

谢谢大家。

3 个答案:

答案 0 :(得分:3)

看看Phil Sturgeon的这篇文章:

http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY

关键是使用原生自动加载,如帖子中所述:

/*
| -------------------------------------------------------------------
|  Native Auto-load
| -------------------------------------------------------------------
| 
| Nothing to do with cnfig/autoload.php, this allows PHP autoload to work
| for base controllers and some third-party libraries.
|
*/
function __autoload($class)
{
    if(strpos($class, 'CI_') !== 0)
    {
        @include_once( APPPATH . 'core/'. $class . EXT );
    }
}

注意

作为备注,您需要将所有“基础”控制器放在CI2 +的core文件夹中

答案 1 :(得分:1)

这个位是正确的

  

public function __contstruct()而不是public function   Parent_controller()

但你要找的是MY_前缀。因此,如果您在/ application / libraries /文件夹中创建控制器并调用文件MY_Controller.php和类MY_Controller,它将起作用。

您还可以在config.php文件中将MY_前缀更改为您想要的任何内容。寻找:

/*
|--------------------------------------------------------------------------
| Class Extension Prefix
|--------------------------------------------------------------------------
|
| This item allows you to set the filename/classname prefix when extending
| native libraries.  For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/core_classes.html
| http://codeigniter.com/user_guide/general/creating_libraries.html
|
*/
$config['subclass_prefix'] = 'MY_';

如需进一步阅读,请参阅http://codeigniter.com/user_guide/general/core_classes.html

答案 2 :(得分:0)

还请注意,它不会加载大量文件。它只是寻找1个名为MY_Controller.php的控制器。

如果您认为它将加载MY_Test_Controller.php和MY_Web_Controller.php,则不会。

如果您可以在一个文件中包含多个控制器,或在该文件中包含其他文件。

您当然可以解决此问题,但是需要了解很多其他信息。