如何扩展代码点火器控制器类?

时间:2009-10-26 17:57:27

标签: php codeigniter

在我的CI系统\ libraries目录中,我有一个名为DD_Controller.php的新类。该文件如下所示:

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

class DD_Controller extends Controller 
{   
    protected $ddauthentication;


    function __construct()
    {           
        parent::Controller();
        $this->ddauthentication = "Authenticated";
    }
}
?>

我的应用程序控制器定义如下:

class Inquiry extends DD_Controller 
{...}

当我扩展Controller时,Inquiry类工作正常,但我得到了

  

致命错误:类'DD_Controller'没有   在发现   C:\研发\本地主机\应用程序\查询\控制器\ inquiry.php   第4行

当我扩展DD_Controller时。在配置文件中,我的前缀定义如下:

$config['subclass_prefix'] = 'DD_';

知道我缺少什么吗?

TIA

3 个答案:

答案 0 :(得分:5)

这是一种更好的方法。执行以下操作:

  1. 转到以下目录:your_ci_app/application/core/并创建一个名为MY_Controller.php的php文件(此文件将位于您的顶级父类所在的位置)
  2. 打开您刚刚创建的文件并添加多个类,如下所示:

    class Admin_Parent extends CI_Controller {
        public function __construct() {
            parent::__construct();
        }
    
        public function test() {
            var_dump("from Admin_Parent");
        }
    }
    
    class User_Parent extends CI_Controller {
    
        public function __construct() {
            parent::__construct();
        }
    
        public function test(){
            var_dump("from User_Parent");
        }
    
    }
    
  3. 在此目录your_ci_app/application/controllers/下创建子控制器。我会称之为adminchild.php

  4. 打开adminchild.php并创建控制器代码,确保扩展父类的名称,如下所示:

    class Adminchild extends Admin_Parent {
    
        function __construct() {
            parent::__construct();
        }
    
        function test() {
            parent::test();
        }
    
    }
    

答案 1 :(得分:4)

DD_Controller.php应该在/ system / application / libraries /

如果您对多个应用程序使用相同的CI,并且希望它们都能够将其控制器扩展到自定义控制器,那么您可以在同一文件中扩展基本Controller类。

在Controller类下面的system / libraries / Controller.php中:

class Mega_Controller extends Controller {
    function Mega_Controller()
    {
        parent::Controller();
        // anything you want to do in every controller, ye shall perform here.
    }
}

然后你就可以在app控制器中执行此操作:

class Home extends Mega_Controller {
    ....

由于您创建的扩展控制器类将可用。我认为这比覆盖基本控制器更好,但这也可以。

答案 2 :(得分:4)

我建议避免“破解”CodeIgniter核心文件。 更好地利用其原生的扩展可能性并尝试融入其中。

我建议对任何PHP库/ CMS使用相同的规则。 这个规则有几个原因: - 能够进行quiclky升级而无需考虑数千个笔记在核心文件中的哪些内容以及如何被破解; - 便携性; - 分享您的代码的可能性 - 例如,您和您的朋友可以在需要时使用它,这将有助于他们保持他们的图书馆最新,与您一样。

换句话说,这更加专业,将来可用性,可移植性和更新应用程序的可能性对您有所帮助。

关于你的个人问题......

对于我来说,使用扩展本机CodeIgniter Controller所需的一切创建自己的库,然后在Controller的构造函数中加载此库并完成后,没有什么不好的。唯一可以提高可用性的是给你的图书馆命名。

通过这种方式,您甚至可以将所需内容分成不同的部分并放入单独的库中: WebFeatures AdminFeatures 等

然后你只需在控制器的构造函数中加载所需的库就可以了。

P.S。我知道提议的方法不适合“正确”的OOP概念,但同时你必须永远不要忘记所用库的完整性。

以上所有内容只是对我7年专业网站开发经验的再看法,所以我希望如果不遵循,那么至少要考虑到它将会有所帮助。

此致 安东