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

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


person Yekver    schedule 01.12.2011    source источник
comment
Я задал тот же вопрос [здесь] [1] [1]: stackoverflow .com/questions/7982187/ Надеюсь, это поможет   -  person luso    schedule 01.12.2011


Ответы (5)


Я так понимаю, вы поместили свой MY_Controller в /application/core и установили префикс в config. Однако я был бы осторожен с использованием индекса в качестве имени класса. Как функция/метод в 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();
    }
...
}

or

class bar extends another_controller {
    public function __construct() {
       parent::__construct();
    }
...
}
person Rooneyl    schedule 01.12.2011
comment
Вероятно, стоит упомянуть, что методы в MY_Controller должны вероятно иметь префикс _, чтобы CI не маршрутизировал их (поскольку по своей природе все методы, которыми вы хотите поделиться со всеми контроллерами, должны быть общедоступными). - person Tim Post♦; 29.04.2012
comment
Конечно, общие методы могут быть защищены вместо общедоступных. Таким образом, они не будут маршрутизироваться, но будут доступны для контроллеров расширения. - person manavo; 17.09.2012

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

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

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

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

<?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
}

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

person RedDragonWebDesign    schedule 15.11.2017

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

require_once(APPPATH."controllers/MyParentController.php");
class MyChildController extends MyParentController {
...
person Cem Yıldız    schedule 29.11.2018

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

ОБНОВЛЕНИЕ

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

person Alexey Gerasimov    schedule 01.12.2011
comment
Я думаю, что не обязательно, чтобы все контроллеры находились под CORE, а только базовые контроллеры. - person luso; 01.12.2011
comment
@luso, я попытался поместить my_controllers в /controllers/core, а Profile & OtherClass (op назвал его Index) в /controllers. Другой класс расширяет Профиль расширяет My_controller. что выдает ошибку. Переместите профиль в /core и все заработает. Можете ли вы поместить Profile & OtherClass в /controllers и заставить его работать? - person Alexey Gerasimov; 01.12.2011
comment
@Алексей Герасимов Я переместил класс Profile в папку application/core, но ничего не изменилось. Я получаю ту же ошибку. Имеет ли значение, какое имя у файла или что-то еще? Что я пропустил? - person Yekver; 01.12.2011
comment
взгляните на stackoverflow.com/questions/7627587/ и philsturgeon.co.uk/blog/2010/02/ - person Rooneyl; 01.12.2011
comment
@Rooneyl Я понял. Но стоит ли создавать функцию __autoload или лучше поместить все общие классы в MY_Controller? - person Yekver; 01.12.2011
comment
@Yekver Просто я, я склонен расширять основные файлы так, как я описал. Автозагрузка на выходе (php.net/manual/en/language.oop5 .autoload.php), и я не хочу ничего переделывать. Я слишком ленив! - person Rooneyl; 01.12.2011
comment
это не приложение/контроллеры/ядро, а /приложение/ядро - person luso; 01.12.2011

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

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

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

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

person Master James    schedule 22.01.2017
comment
Прокомментируйте причину перед голосованием против. - person Vishal Kumar Sahu; 24.11.2017
comment
Скорее всего, они любят php, прошу прощения, если кого обидел. - person Master James; 25.11.2017
comment
Они не любят PHP... Не все фреймворки обеспечивают работу с файлами и всегда нуждаются в доработке. - person Vishal Kumar Sahu; 25.11.2017