我严格遵循how-to article by Phil Sturgeon来扩展基本控制器。但我仍然有一些错误。
我的3个课程:
// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
public function __construct(){
parent::__construct();
}
}
// application/libraries/Public_Controller.php
class Public_Controller extends MY_Controller{
public function __construct(){
parent::__construct();
}
}
// application/controllers/user.php
class User extends Public_Controller{
public function __construct(){
parent::__construct();
}
}
致命错误:第2行的/srv/www/xxx/application/controllers/user.php中找不到“Public_Controller”类
好奇的是,如果我直接从MY_Controller
延伸,则以下代码段正在运行:
// application/controllers/user.php
class User extends MY_Controller{
public function __construct(){
parent::__construct();
}
}
我已经通过__autoload()
或手动加载了控制器。控制器成功加载。
CI-Version:1.7.3
答案 0 :(得分:7)
您需要在MY_Controller中使用公共控制器
// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
public function __construct(){
parent::__construct();
}
}
require(APPPATH.'libraries/Public_Controller.php');
您收到错误,因为从未加载过Public_Controller。这样做可以让您从Public_Controller
我喜欢你在做什么,因为我一直这样做。
如果要创建Admin_Controller
,也可以在MY_Controller中执行此操作// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
public function __construct(){
parent::__construct();
}
}
require(APPPATH.'libraries/Public_Controller.php'); // contains some logic applicable only to `public` controllers
require(APPPATH.'libraries/Admin_Controller.php'); // contains some logic applicable only to `admin` controllers
答案 1 :(得分:5)
您应该将Public_controller
放入MY_Controller
内的MY_Controller.php
// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
public function __construct(){
parent::__construct();
}
}
class Public_Controller extends MY_Controller{
public function __construct(){
parent::__construct();
}
}
我到处使用__construct它工作正常我最近写了an article关于如何将auth逻辑包装到扩展控制器中。当我开始讨论构建你的控制器时,这大概只有一半。
答案 2 :(得分:1)
问题在这里解决了:http://devcrap.net/pl/2011/09/04/codeigniter-dziedziczenie-z-my_controller-extends-my_controller/。在抛光,但代码是好的:]
答案 3 :(得分:1)
我有这样的问题,经过一些搜索我发现自己犯了错误,因为我的控制器类名是MY_Controller,但文件名是My_Controller [Case not matching]。 注意: - 在localhost中我没有任何错误。
在扩展控制器中我使用
class Home extends MY_Controller{
function __construct() {
parent::__construct();
}
}
即使我收到错误。
将我的文件名更改为MY_Controller后,它开始运作良好。
答案 4 :(得分:0)
我有一个名为 MY_Controller
的自定义控制器类,它扩展了CI_Controller,它运行正常。它位于应用程序/核心,它在我的站点中具有自定义功能加载视图。
我使用一个抽象类 My_app_controller
扩展MY_Controller
以获取my_app特定的行为,我希望my_app中的每个控制器都扩展这个抽象类。 (我在网站上使用不同的应用,因此有些应用会扩展My_app_controller
而其他应用会扩展My_other_apps_controllers
)
但是,当我尝试从应用程序中的任何控制器扩展My_app_controller
时,“ Main_app_controller extends My_app_controller
”会生成类'My_app_controller'找不到异常
我找到了两个解决方案:
在Main_app_controller.php文件中使用 include_once 。
include_once APPPATH.'controllers/path/to/My_app_controler.php';
打破代码点火器的“每个文件一个类”规则,并在同一个文件My_app_controller
中定义MY_Controller
(在应用程序/核心下)。
手册说:
为每个类使用单独的文件,除非这些类是紧密的 相关
嗯......他们是。
无论如何,我更喜欢使用include_once解决方案,因为我认为每个类有一个文件更好,而My_app_controller位于application / controllers / my_app文件夹下。 (因此将存在application / controllers / other_apps)