Создание базового класса, расширяющего кодигнитор другого базового класса

class Settings extends USER_Controller {...}

class USER_Controller extends MY_Controller {...}//limit access to user and define some params and functions that is user depended

class MY_Controller extends CI_Controller {...}//provide extra functionality accross all controllers

хорошо, если я попытаюсь создать выше 3 класса, это не будет работать.

пока, если я просто использую settings extends MY_Controller это будет работать нормально.

так есть ли способ поместить средний класс между моим контроллером и MY_Controller - базовым контроллером, который расширяет CI_Controller?

5 ответов

Решение

Как сказал @Minhaz Ahmed, проблема заключается в загрузке класса. Codeigniter загружает класс только с префиксом подкласса, как в,

https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/CodeIgniter.php

if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
{
    require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
}

Так что после некоторых раскопок я пришел с решением, используя оба ловушки codeigniter и spl_​autoload_​register() для моего проекта без взлома Ядра. Пожалуйста, следуйте инструкциям, чтобы достичь того, что находится в ВОПРОСЕ.

  1. Включить хуки в файле конфигурации, если это еще не сделано.

  2. создайте хук в application / config / hooks.php, как показано ниже.

    $hook['pre_system'] = array( 'class' => '', 'function' => 'autoload', 'filename' => 'autoload.php', 'filepath' => 'hooks', 'params' => '' );

  3. Создать autoload.php в application/hooks папка.

  4. внутри autoload.php файл,

    function autoload() { spl_autoload_register(function($class) { if(strpos($class,'CI_') !== 0 && file_exists(APPPATH.'core/'.$class.EXT)) { require_once APPPATH . 'core/' . $class . EXT; } }); }

Вот и все.

Примечание: здесь я использовал pre_system не крюк pre_controller, так как codeigniter загружает базовые классы контроллера между pre_system а также pre_controller крючки.

Надеюсь это поможет. Если есть какие-либо проблемы с этим, пожалуйста, оставляйте комментарии.

Что лучше всего подействовало на CI 2.1.4:
приложение / ядро

создать например:
- base_controller (базовые инструкции, начиная с ci_controller)
- admin_controller (расширяется от basecontroller и добавляет инструкции по аутентификации)


Затем используйте их в: application/controllers:
например:
класс пользователей расширяет admin_controller...

Поместите файл класса user_controller в конец MY_Controller.php

MY_Controller.php в /application/core/

class MY_Controller extends CI_Controller {...}
class USER_Controller extends MY_Controller {...}

Теперь из вашего контроллера в вашей папке контроллеров вы можете расширить контроллер из USER_Controller:

 class Settings extends USER_Controller {...}

Вы можете расширить класс так, как вы хотите, но проблема заключается в загрузке класса, вы должны включить свой USER_Controller ваш Settings Учебный класс. Проблема не в расширении, а в включении файла, поэтому вы должны найти способ включить второй класс.

См. http://www.php.net/manual/en/function.spl-autoload.php

Вы можете использовать основное решение Фила, его просто и легко.

http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY

Другие вопросы по тегам