Создание базового класса, расширяющего кодигнитор другого базового класса
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()
для моего проекта без взлома Ядра. Пожалуйста, следуйте инструкциям, чтобы достичь того, что находится в ВОПРОСЕ.
Включить хуки в файле конфигурации, если это еще не сделано.
создайте хук в application / config / hooks.php, как показано ниже.
$hook['pre_system'] = array( 'class' => '', 'function' => 'autoload', 'filename' => 'autoload.php', 'filepath' => 'hooks', 'params' => '' );
Создать
autoload.php
в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
не крюк 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://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY