CodeIgniter 3中的扩展和扩展类

时间:2016-10-28 20:18:57

标签: php codeigniter oop

我在“application / core”中有一个控制器“MY_Controller.php”,扩展了“CI_Controller”:

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

class MY_Controller extends CI_Controller
{

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

        $this->load->helper('form');
        $this->load->helper('url');
        $this->load->helper('security');
        $this->load->helper('language');

        // Load language file
        $this->lang->load('en_admin', 'english');

    }

}

我在“application / controllers”中创建了另一个名为“Auth.php”的控制器,扩展了“MY_Controller”:

class Auth extends MY_Controller
{

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

        $this->load->library('ion_auth');

        if ($this->ion_auth->logged_in() === FALSE) {

            redirect('user/login');

        }
    }
}

我创建了第三个控制器“Dashboard.php”,它应该扩展“Auth”,但会抛出错误:

class Dashboard extends Auth
{
    public function index()
    {
        echo 'Hello from the dashboard';
    }
}

致命错误:第5行/home/user/www/forum/application/controllers/Dashboard.php中找不到“Auth”类

非常感谢您提出解决此问题的建议。

3 个答案:

答案 0 :(得分:0)

link in my comment有多种方法可以解决您的问题。我更喜欢使用#3方法 - “使用带挂钩的自动加载功能”。这对我有用。

<强>应用/配置/ config.php中

+-------------+-----------+-------------+
| FN1         | LN        | FN2         |
+-------------+-----------+-------------+
| Geraint     | Davies    | David T. C. |
| Philip      | Davies    | David T. C. |
| David T. C. | Davies    | Philip      |
| David T. C. | Davies    | Geraint     |
| Mr Nigel    | Evans     | Graham      |
| Graham      | Evans     | Mr Nigel    |

<强>应用/配置/ hooks.php

$config['enable_hooks'] = TRUE;

<强>应用/钩/ Auto_load.php

$hook['pre_system'][] = array(
  'class' => '',
  'function' => 'register_autoloader',
  'filename' => 'Auto_load.php',
  'filepath' => 'hooks'
);

CI_Controller的第一个扩展 - <?php defined('BASEPATH') OR exit('No direct script access allowed'); function register_autoloader() { spl_autoload_register('site_autoloader'); } /* * Custom autoloader. * This piece of code will allow controllers and other classes * that do not start with "CI_" to be loaded when * extending controllers, models, and libraries. */ function site_autoloader($class) { if(strpos($class, 'CI_') !== 0) { if(file_exists($file = APPPATH.'core/'.$class.'.php')) { require_once $file; } elseif(file_exists($file = APPPATH.'libraries/'.$class.'.php')) { require_once $file; } elseif(file_exists($file = APPPATH.'models/'.$class.'.php')) { require_once $file; } } } - 可能应该在class MY_Controller extends CI_Controller中。任何扩展application/core/MY_Controller.php的类都应该在MY_Controller

链接页面将“钩子”方法标记为“慢速和正确的方式”,但我将其与“2.使用自动加载功能(快速和肮脏的方式)”进行比较时显示时间差略超过一微秒。这不值得担心。

我使用了“快速而肮脏的方式”多年但在升级​​CI时一直忘记它而我会覆盖配置文件导致丢失的自动加载器例程。除了记住将application/libraries/设置为$config['enable_hooks']之外,使用钩子方法没有问题。

答案 1 :(得分:0)

这是常规行为。控制器不会相互扩展。它们可能只扩展MY_Controller(或CI_Controller)。所有MVC框架都是如此 使用ion_auth的方法不是扩展Auth控制器。您已经加载了ion_auth库,因此您可以在所有控制器中直接使用其方法,就像在Auth控制器中使用它们一样。 ion_auth here的文档。

答案 2 :(得分:0)

好吧,我从未使用过MY_Controller。我指定了我的班级名称。

我在应用程序/库下创建了所有类,我的结构是

管理员扩展了Common_Controller Common_Controller为admin和member login / auth等处理auth的东西 Admin是application / modules / admin / controllers / Admin.php

中的Controller

Common_Controller扩展了Base_Controller Base_Controller处理所有控制器共有的所有东西,如模板等

Base_Controller扩展了MX_Controller MX_Controller是wiredesignz HMVC控制器

MX_Controller扩展了CI_Controller 我们已经完成了。

这当然是HMVC设置,但原理是相同的。只是不要使用MY_Controller,给它一个真实的名字并正常使用它。

当然,HMVC使用MY_Loader和MY_xxx用于将自己挂钩到CI中,并且它们位于应用程序/核心之下,并且它们都可以很好地运行。

据我所知,扩展时你可以走多少课程没有限制。