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?
Как сказал @Minhaz Ahmed , проблема заключается в загрузке класса. Codeigniter загружает только класс с префиксом подкласса как в,
https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/CodeIgniter.php#L276
if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) { require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; }
Поэтому после некоторых раскопок я пришел с решением, использующим как hook, так и spl_autoload_register()
для моего проекта без взлома CORE. Пожалуйста, следуйте инструкциям, чтобы достичь того, что находится в ВОПРОС .
Включите перехваты в конфигурационном файле, если он еще не установлен.
создайте крючок в приложении / config / hooks.php, как показано ниже.
$hook['pre_system'] = array( 'class' => '', 'function' => 'autoload', 'filename' => 'autoload.php', 'filepath' => 'hooks', 'params' => '' );
Создайте папку application/hooks
папке application/hooks
.
внутри файла 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
hook, а не pre_controller
, поскольку codeigniter загружает классы базового контроллера между pre_system
и pre_controller
hooks.
Надеюсь это поможет. Если есть какие-либо проблемы с этим, пожалуйста, сделайте комментарии.
Поместите файл класса user_controller в конец MY_Controller.php
MY_Controller.php in / application / core /
class MY_Controller extends CI_Controller {...} class USER_Controller extends MY_Controller {...}
Теперь из вашего контроллера в папке ваших контроллеров вы можете расширить контроллер из USER_Controller:
class Settings extends USER_Controller {...}
Что сделало лучшую работу для CI 2.1.4:
приложение / ядро
создайте, например:
– base_controller (базовые инструкции, простирающиеся от ci_controller)
– admin_controller (расширение от базового контроллера и добавление инструкций аутентификации)
Затем используйте их в: application / controllers:
например:
пользователи класса расширяют admin_controller …
Вы можете использовать основное решение Фила, просто и просто.
http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY
Вы можете расширить класс так, как хотите, но проблема заключается в загрузке класса, вы должны включить свой USER_Controller
свой класс Settings
. Проблема заключается не в том, что проблема включает в себя файл, поэтому вам нужно найти способ включения второго класса.