我在“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”类
非常感谢您提出解决此问题的建议。
答案 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
中的ControllerCommon_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中,并且它们位于应用程序/核心之下,并且它们都可以很好地运行。
据我所知,扩展时你可以走多少课程没有限制。