Расширение класса контроллера в CodeIgniter - PullRequest
17 голосов
/ 01 декабря 2011

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

Fatal error: Class 'Profile' not found

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

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

Ответы [ 5 ]

27 голосов
/ 01 декабря 2011

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

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

/* 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();
    }
...
}
5 голосов
/ 15 ноября 2017

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

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

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

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

1 голос
/ 30 ноября 2018

Это возможно с Codeigniter 3. Достаточно просто включить родительский файл.

require_once(APPPATH."controllers/MyParentController.php");
class MyChildController extends MyParentController {
...
0 голосов
/ 22 января 2017

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

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

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

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

0 голосов
/ 01 декабря 2011

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

ОБНОВЛЕНИЕ

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...