Код Igniter 2: Как продлить CI_Controller несколько раз?
Я успешно расширил класс CI_Controller, создав MY_Controller.php, который я разместил в каталоге application/core.
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.
Цель состоит в том, что контроллеры admin расширяют свой базовый класс, чем интерфейсные контроллеры.
Административный базовый контроллер будет выглядеть следующим образом:
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/. Но я хочу два класса контроллера, и они не могут иметь одинаковое имя файла.
Ответы
Ответ 1
Вы просто положили оба в один и тот же файл, у меня есть проект, который точно такой же, как этот.
У нас есть как администратор, так и обычный расширенный контроллер в файле MY_Controller.php
, отлично работает.
Основной причиной для MY_Controller
или других расширенных файлов является то, что CodeIgniter auto инициирует их при загрузке базового файла (будь то библиотека, помощник и т.д.), вы можете иметь много классов в этих файлах.
Edit:
Вам даже не нужно называть их MY_Admin_Controller
или MY_Controller
, мы имеем Admin_Controller
и User_Controller
и Ajax_Controller
в файле MY_Controller
Ответ 2
То, что вы делаете, правильно. Вам просто нужны все эти файлы в каталоге application/core
. Здесь сообщение Фила Штургера относительно этого:
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()
, которую Фил описывает в своем сообщении.
Ответ 3
Это довольно легко. Выполните следующие действия:
- Перейдите в следующий каталог:
your_ci_app/application/core/
и создайте php файл с именем MY_Controller.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();
}
}
Ответ 4
если вы хотите расширить другой класс вместо CI_controller, вы должны включить целевой класс. например
include 'auth.php';
class test extends Auth