Подтвердить что ты не робот

Расширение класса контроллера в 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, который я запускаю.

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

4b9b3361

Ответ 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.]