CodeIgniter 2: Как расширить CI_Controller несколько раз? - PullRequest
27 голосов
/ 02 октября 2011

Я успешно расширил класс 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();
    }
}

Anобычный контроллер для страниц администратора:

class Admin_home extends MY_Admin_Controller {

    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        $this->load->view('admin_home');
    }
}

Проблема заключается в том, что для расширения класса CI_Controller необходимо присвоить файлу контроллера имя PREFIX_Controller.php и поместить его в каталог core /.Но мне нужны два класса контроллеров, и они не могут иметь одинаковые имена файлов.

Ответы [ 5 ]

28 голосов
/ 02 октября 2011

Вы просто поместите оба в один файл, у меня есть проект, который точно такой же, как этот.

В файле MY_Controller.php есть только администратор и обычный расширенный контроллер, он отлично работает.

Основная причина MY_Controller или других расширенных файлов заключается в том, что CodeIgniter автоматически запускает их при загрузке базового файла (будь то библиотека, вспомогательный файл и т. Д.), В этих файлах может быть много классов.

Edit:

Вам даже не нужно называть их MY_Admin_Controller или MY_Controller, у нас есть Admin_Controller и User_Controller и Ajax_Controller в MY_Controller файле

17 голосов
/ 03 октября 2011

То, что вы делаете, правильно.Вам просто нужны все эти файлы в каталоге 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 голосов
/ 05 февраля 2015

Это довольно просто. Сделайте следующее:

  1. Перейдите в следующий каталог: your_ci_app/application/core/ и создайте php-файл с именем MY_Controller.php (в этом файле будут находиться ваши верхние родительские классы)
  2. Откройте этот файл, который вы только что создали, и добавьте несколько классов, например:

    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");
        }
    
    }
    
  3. Создайте дочерние контроллеры в этом каталоге your_ci_app/application/controllers/. Я назову это adminchild.php

  4. Откройте adminchild.php и создайте код контроллера, убедитесь, что вы расширили имя родительского класса, например:

    class Adminchild extends Admin_Parent {
    
        function __construct() {
            parent::__construct();
        }
    
        function test() {
            parent::test();
        }
    
    }
    
1 голос
/ 18 июня 2016

если вы хотите расширить другой класс вместо CI_controller, вы должны включить целевой класс.например

include 'auth.php';

class test extends Auth
0 голосов
/ 14 августа 2018

Все файлы в папке приложение / ядро ​​МОЙ подкласс CIУ МОЯ есть 2 подкласса Public и Dashboard

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

Public

class Public_Controller extends My_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

Dashboard имеет 2 подкласса: Admin и User

class Dashboard_Controller extends My_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

Admin

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');

в контроллер / 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');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...