Подтвердить что ты не робот

Код 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/. Но я хочу два класса контроллера, и они не могут иметь одинаковое имя файла.

4b9b3361

Ответ 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