Я строго следил за практической статьей Фила Стерджона , чтобы расширить базовый контроллер. Но я все еще ошибаюсь.
Мои 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», не найденное .
Я нашел два решения:
используйте include_once в файле Main_app_controller.php.
include_once APPPATH.'controllers/path/to/My_app_controler.php';
разбить правило «один класс на файл» воспламенителя кода и определить мой My_app_controller
только в том же файле. MY_Controller
(в приложении / ядре).
Руководство говорит:
Используйте отдельные файлы для каждого класса, если классы не связаны друг с другом
Ну … они есть.
Во всяком случае, я предпочел использовать решение include_once, поскольку я считаю, что лучше иметь один файл для каждого класса, а My_app_controller находится в папке application / controllers / my_app. (так что приложения / контроллеры / other_apps будут существовать)