У меня есть class MY_Controller extends CI_Controller
и общую логику для большого раздела профиля, поэтому я пытался создать class Profile extends MY_Controller
с общей логикой для раздела профиля, и весь класс, связанный с этим разделом, должен расширять этот класс профиля, насколько я понимаю, но когда Я попытался создать class Index extends Profile
Я получаю сообщение об ошибке:
Fatal error: Class 'Profile' not found
CodeIgniter пытается найти этот класс в index.php
который я запускаю.
Где моя ошибка? Или, может быть, есть более лучший способ выделить общую логику?
Полагаю, вы поместили свой 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.]