Расширитель Codeigniter расширенный MY_Controller

Я строго следил за практической статьей Фила Стерджона , чтобы расширить базовый контроллер. Но я все еще ошибаюсь.

Мои 3 класса:

// application/libraries/MY_Controller.php class MY_Controller extends Controller{ public function __construct(){ parent::__construct(); } } // application/libraries/Public_Controller.php class Public_Controller extends MY_Controller{ public function __construct(){ parent::__construct(); } } // application/controllers/user.php class User extends Public_Controller{ public function __construct(){ parent::__construct(); } } 

Неустранимая ошибка: Class 'Public_Controller' не найден в /srv/www/xxx/application/controllers/user.php в строке 2

Любопытно, что следующий фрагмент работает, если я непосредственно MY_Controller из MY_Controller :

 // application/controllers/user.php class User extends MY_Controller{ public function __construct(){ parent::__construct(); } } 

Я загрузил контроллеры через __autoload() или вручную. Контроллеры загружаются успешно.

CI-версия: 1.7.3

Вы должны требовать от Public Controller в своем MY_Controller

 // application/libraries/MY_Controller.php class MY_Controller extends Controller{ public function __construct(){ parent::__construct(); } } require(APPPATH.'libraries/Public_Controller.php'); 

Вы получаете ошибку, потому что Public_Controller никогда не был загружен. Это позволит вам перейти от Public_Controller

Мне нравится то, что вы делаете, потому что я все время это делаю.

Вы можете сделать это также в своем MY_Controller, если вы хотите создать Admin_Controller

 // application/libraries/MY_Controller.php class MY_Controller extends Controller{ public function __construct(){ parent::__construct(); } } require(APPPATH.'libraries/Public_Controller.php'); // contains some logic applicable only to `public` controllers require(APPPATH.'libraries/Admin_Controller.php'); // contains some logic applicable only to `admin` controllers 

Вы должны разместить Public_controller с помощью MY_Controller внутри MY_Controller.php

 // application/libraries/MY_Controller.php class MY_Controller extends Controller{ public function __construct(){ parent::__construct(); } } class Public_Controller extends MY_Controller{ public function __construct(){ parent::__construct(); } } 

Я использую __construct всюду, и он отлично работает. Недавно я написал статью о том, как это сделать в отношении переноса вашей логики auth в ваши расширенные контроллеры. Это примерно на полпути вниз, когда я начинаю обсуждать создание ваших контроллеров.

Проблема была решена здесь: http://devcrap.net/pl/2011/09/04/codeigniter-dziedziczenie-z-my_controller-extends-my_controller/ . В полировке, но код хорош:]

У меня была проблема вроде этого. После некоторого поиска я обнаружил, что ошибка была сделана сама, потому что мое имя класса контроллера было MY_Controller, но имя файла было My_Controller [Case not matching]. Примечание: – В localhost у меня не было никаких ошибок.

В расширенном контроллере я использую

 class Home extends MY_Controller{ function __construct() { parent::__construct(); } } 

даже я получил ошибку.

После изменения имени файла в MY_Controller он начал работать хорошо.

У меня есть собственный класс контроллера MY_Controller который расширяет CI_Controller, и он работает нормально. Он находится в приложении / ядре, и у него есть пользовательские функции, которые просматривают мои объявления на моем сайте.

Я использую абстрактный класс My_app_controller который расширяет MY_Controller для my_app определенного behabior, я хочу, чтобы каждый контроллер в my_app расширил этот абстрактный класс. (Я использую разные приложения на сайте, поэтому некоторые приложения расширят My_app_controller а другие приложения расширят My_other_apps_controllers )

Но когда я пытаюсь расширить My_app_controller от любого контроллера в своем приложении, « Main_app_controller extends My_app_controller » генерирует исключение класса «My_app_controller», не найденное .

Я нашел два решения:

  1. используйте include_once в файле Main_app_controller.php.
    include_once APPPATH.'controllers/path/to/My_app_controler.php';

  2. разбить правило «один класс на файл» воспламенителя кода и определить мой My_app_controller только в том же файле. MY_Controller (в приложении / ядре).

Руководство говорит:

Используйте отдельные файлы для каждого класса, если классы не связаны друг с другом

Ну … они есть.

Во всяком случае, я предпочел использовать решение include_once, поскольку я считаю, что лучше иметь один файл для каждого класса, а My_app_controller находится в папке application / controllers / my_app. (так что приложения / контроллеры / other_apps будут существовать)