2014-02-09 3 views
0
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 класса, это не сработает.Создание основного класса, который расширяет другой базовый класс codeigniter

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

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

+0

Как вы расширили основные классы? вы использовали разные файлы? –

+0

Даже если это обозначено как дублируемое, принятое решение здесь намного лучше, чем все другие решения, предложенные в «оригинальном» вопросе. – Chococroc

ответ

3

Как @Minhaz Ахмед сказал, проблема загрузки класса. 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'; 
} 

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

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

  2. Создайте крючок в приложении/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 крючками.

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

+0

хороший код, спасибо за обмен – Zalaboza

+0

Вы пробовали в CI 3.0.3? Он не работает в CI 3.0.3 – Abaij

+0

Ни один человек .. Извините .. Я вне связи с CI .. Перемещено Laravel;) – IJas

0

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

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

+0

Решение Whith Phil вы можете определить только одну автозагрузку. Проверьте http://php.net//manual/en/function.spl-autoload-register.php – Chococroc

+0

Вы можете расширить все классы друг к другу, если хотите другой основной класс. Так на основе объектно-ориентированной идеи, основанной на этом? –

+0

Да, проблема не в расширении, проблема в том, как ваш PHP-файл находит классы, когда они не включены напрямую в ваш код через include/require. __autoload определяет, как это сделать, но с spl_autoload_register вы можете определить более одной функции, если он не найдет ее с autolad и не включен – Chococroc

1

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

MY_Controller.php в/приложения/ядра/

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

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

class Settings extends USER_Controller {...} 
0

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

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

1

Что сделал лучшую работу для CI 2.1.4:
приложение/ядро ​​

создать, например:
- base_controller (инструкции основания, простирающийся от ci_controller)
- admin_controller (от базового контролера и добавляет инструкции аутентификации)


Затем используйте t окружать: приложения/контроллеры:
, например:
пользователей класса расширяет admin_controller ...

Смежные вопросы