【问题标题】:Extending and extended class in CodeIgniter 3CodeIgniter 3 中的扩展和扩展类
【发布时间】:2017-03-11 19:03:24
【问题描述】:

我在“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');

    }

}

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

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”类

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

【问题讨论】:

  • 尝试将 Auth 控制器添加到控制器自动加载中。我认为您遇到的问题是 CodeIgniter 期望加载该类,因此它知道它
  • 这与 CI 查找控制器的方式有关。这会导致将它们扩展到第一个 MY_Controller 之外的问题。多个解决方案可以found here
  • 只需将 Auth 类放在 MY_Controller.php 文件中即可。

标签: php codeigniter oop


【解决方案1】:

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

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

Admin 扩展 Common_Controller Common_Controller 为管理员和成员登录/身份验证等处理身份验证内容 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 中,它们位于 application/core 下,并且运行良好。

据我所知,在扩展它们时,你可以深入多少类是没有限制的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 所以基本上,我可以完全删除 Auth 类并直接在每个需要密码保护的控制器的构造函数中使用 ion_auth 库和登录检查?
    • @TitusQuinn 是的,当然。 Auth 类是 ion_auth 库中包含的一个控制器,用于展示它的使用方式。它不是图书馆的一部分。
    【解决方案3】:

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

    application/config/config.php

    $config['enable_hooks'] = TRUE;
    

    application/config/hooks.php

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

    application/hooks/Auto_load.php

    <?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;
                }
            }
        }
    

    您的 CI_Controller 的第一个扩展 - class MY_Controller extends CI_Controller - 可能应该在 application/core/MY_Controller.php 中。任何扩展 MY_Controller 的类都应该在 application/libraries/ 中。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2017-03-28
      相关资源
      最近更新 更多