Расширение класса контроллера в CodeIgniter

У меня есть class MY_Controller extends CI_Controller и общую логику для большого раздела профиля, поэтому я пытался создать class Profile extends MY_Controller с общей логикой для раздела профиля, и весь класс, связанный с этим разделом, должен расширять этот класс профиля, насколько я понимаю, но когда Я попытался создать class Index extends Profile Я получаю сообщение об ошибке:

 Fatal error: Class 'Profile' not found 

CodeIgniter пытается найти этот класс в index.php который я запускаю.

Где моя ошибка? Или, может быть, есть более лучший способ выделить общую логику?

Related of "Расширение класса контроллера в CodeIgniter"

Полагаю, вы поместили свой MY_Controller в / application / core и задали префикс в конфиге. Однако я был бы осторожен в использовании индекса как имени класса. Как функция / метод в Codeigniter имеет особое поведение.

Если вы хотите расширить этот контроллер, вам нужно поместить классы в один и тот же файл.

Например, ядро ​​ввода / приложения

 /* start of php file */ class MY_Controller extends CI_Controller { public function __construct() { parent::__construct(); } ... } class another_controller extends MY_Controller { public function __construct() { parent::__construct(); } ... } /* end of php file */ 

В / приложение / контроллеры

 class foo extends MY_Controller { public function __construct() { parent::__construct(); } ... } 

или

 class bar extends another_controller { public function __construct() { parent::__construct(); } ... } 

Все классы, которые вы распространяете, должны жить в каталоге приложений / CORE, поэтому в вашем случае должны находиться как My_Controller, так и Profile. Все контроллеры «конечной точки» будут жить в папке приложений / контроллеров

ОБНОВИТЬ

Я стою исправлено. Расширенные классы должны жить в одном файле. @ Ответ Роунеля показывает, как реализовать

Я нашел эту страницу в Google, потому что у меня была такая же проблема. Мне не понравились ответы, перечисленные здесь, поэтому я создал собственное решение.

1) Поместите родительский класс в core папку.

2) Поместите инструкцию include в начале всех классов, которые включают родительский класс.

Таким образом, типичный контроллер может выглядеть так:

 <?php require_once APPPATH . 'core/Your_Base_Class.php'; // must use require_once instead of include or you will get an error when loading 404 pages class NormalController extends Your_Base_Class { public function __construct() { parent::__construct(); // authentication/permissions code, or whatever you want to put here } // your methods go here } 

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

После некоторой борьбы с версией 3 и этой проблемой я решил, что это не плохое решение …

 require_once BASEPATH.'core/Controller.php'; require_once APPPATH.'core/MYCI_Controller.php'; 

добавить эту вторую строку, где первая существует в системе / ядре / CodeIgniter.php

[Если не слишком поздно, я настоятельно рекомендую против php и / или CodeIgniter.]