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