Расширение класса контроллера в 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
, который я запускаю.
Где моя ошибка? Или, может быть, есть более лучший способ выделить общую логику?
Ответы
Ответ 1
Полагаю, вы поместили свой 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();
}
...
}
Ответ 2
Я нашел эту страницу в 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
Это возможно с Codeigniter 3. Достаточно просто включить родительский файл.
require_once(APPPATH."controllers/MyParentController.php");
class MyChildController extends MyParentController {
...
Ответ 4
Все классы, которые вы распространяете, должны находиться в каталоге приложений /CORE, поэтому в вашем случае должны находиться как My_Controller, так и Profile. Все контроллеры "конечной точки" будут жить в папке приложений/контроллеров.
ОБНОВЛЕНИЕ
Я стою исправлено. Расширенные классы должны жить в одном файле. @Rooneyl ответ показывает, как реализовать
Ответ 5
После некоторой борьбы с версией 3 и этой проблемой я решил, что это не плохое решение...
require_once BASEPATH.'core/Controller.php';
require_once APPPATH.'core/MYCI_Controller.php';
чтобы добавить эту вторую строку, где первая существует в системе /core/CodeIgniter.php
[Если не слишком поздно, я настоятельно рекомендую против php и/или CodeIgniter.]