我已经成功扩展了CI_Controller类,创建了一个放在应用程序/核心目录中的MY_Controller.php。
core / My_Controller.php看起来像这样:
class MY_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
}
}
然后,当我创建普通控制器时,它们看起来像这样:
class Home extends MY_Controller {
function __construct()
{
parent::__construct();
}
function index()
{
$this->load->view('home');
}
}
我正在创建一个管理员后端,我希望为控制器提供一个不同的基类而不是My_Controller。这样我就可以使用管理控制器的常用方法(即authentication_check等)
我无法解决的是如何创建另一个扩展CI_Controller的控制器。
目标是管理员控制器扩展与前端控制器不同的基类。
管理员基础控制器如下所示:
class MY_Admin_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
}
}
管理页面的常规控制器:
class Admin_home extends MY_Admin_Controller {
function __construct()
{
parent::__construct();
}
function index()
{
$this->load->view('admin_home');
}
}
问题是要扩展CI_Controller类,必须将控制器文件命名为PREFIX_Controller.php并将其放在core /目录中。但我想要两个控制器类,它们不能具有相同的文件名。
答案 0 :(得分:28)
你只需将它们放在同一个文件中,我有一个与此完全相同的项目。
我们在MY_Controller.php
文件中只有admin和普通扩展控制器,工作正常。
MY_Controller
或其他扩展文件的主要原因是,当您加载基本文件(无论是库,帮助程序等)时,CodeIgniter会自动启动它们,您可以在这些文件中包含许多类。 / p>
编辑:
您甚至不需要给他们MY_Admin_Controller
或MY_Controller
打电话,我们在Admin_Controller
中有User_Controller
和Ajax_Controller
以及MY_Controller
文件
答案 1 :(得分:17)
你所做的是正确的。您只需要application/core
目录中的所有这些文件。这是Phil Sturgeon关于此的一篇文章:
<德尔> http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY 德尔>
http://philsturgeon.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY/
诀窍是使用__autoload()
函数 - Phil在帖子中描述。
答案 2 :(得分:3)
这很简单。执行以下操作:
your_ci_app/application/core/
并创建一个名为MY_Controller.php
的php文件(此文件将位于您的顶级父类所在的位置)打开您刚刚创建的文件并添加多个类,如下所示:
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");
}
}
在此目录your_ci_app/application/controllers/
下创建子控制器。我会称之为adminchild.php
打开adminchild.php
并创建控制器代码,确保扩展父类的名称,如下所示:
class Adminchild extends Admin_Parent {
function __construct() {
parent::__construct();
}
function test() {
parent::test();
}
}
答案 3 :(得分:1)
如果要扩展另一个类而不是CI_controller,则必须包含目标类。例如
include 'auth.php';
class test extends Auth
答案 4 :(得分:0)
文件夹 application / core
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
echo "This is " . __CLASS__ . "<br />";
}
}
公共
class Public_Controller extends My_Controller
{
public function __construct()
{
parent::__construct();
echo "This is " . __CLASS__ . "<br />";
}
}
仪表板有2个子类,即Admin和User
class Dashboard_Controller extends My_Controller
{
public function __construct()
{
parent::__construct();
echo "This is " . __CLASS__ . "<br />";
}
}
管理员
class Admin_Controller extends Dashboard_Controller
{
public function __construct()
{
parent::__construct();
echo "This is " . __CLASS__ . "<br />";
}
}
用户
class User_Controller extends Dashboard_Controller
{
public function __construct()
{
parent::__construct();
echo "This is " . __CLASS__ . "<br />";
}
}
在 config / config.php
中/* load class in core folder */
function my_load($class) {
if (strpos($class, 'CI_') !== 0) {
if (is_readable(APPPATH . 'core' . DIRECTORY_SEPARATOR . $class . '.php' )) {
require_once (APPPATH . 'core' . DIRECTORY_SEPARATOR . $class . '.php');
}
}
}
spl_autoload_register('my_load');
在 controller / Home.php
中//class Home extends MY_Controller {
//class Home extends Dashboard_Controller {
class Home extends Admin_Controller {
public function index()
{
echo "This is " . __CLASS__ . "<br />";
//$this->load->view('home');
}
}