Intereting Posts
php – вставить переменную в строку эха MongoCursorTimeoutException для агрегатной функции Попытка получить общую сумму на основе ввода пользователем FOSRestBundle: показать мое пользовательское сообщение об исключении Загрузка большого файла Apache / PHP (> 2Gb) MYSQL и предложение LIMIT Как разобрать GCM, чтобы удалить неверный идентификатор регистрации с сервера с помощью php Существует ли разница между тернарным оператором и условием? Инструмент для удаления холста javascript ничего не делает CakePHP – ошибка помощника TinyMceHelper: метод TinyMceHelper :: __ name не существует Symfony2 – Как остановить Form-> handleRequest от обнуления полей, которые не существуют в данных post Синхронизировать удаленную и локальную базу данных MySQL с помощью phpMyAdmin Как управлять различными настройками php.ini в процессе производства и разработки? Ajax Refresh of Div на форме submit oscommerce Как получить идентификатор видео из URL? (DailyMotion)

Расширение CI_Controller

Все, что я пытаюсь сделать, это нечто довольно простое:

  • Создайте класс (скажем, brandNewClass – NOT MY_Controller ), который расширяет CI_Controller
  • Создайте другие контроллеры, которые расширяют brandNewClass

Например

 class brandNewClass extends CI_Controller { public function index() { } public function info() { } } 

используется как (в файле под /controllers ):

 <?php class newController extends brandNewClass { } ?> 

Дело в том, что, хотя оно работает, когда я MY_Controller файл под /application/core и называя его MY_Controller , когда я меняю имя на что-то более … самоочевидное, это не так.

Неустранимая ошибка: класс «brandNewClass» не найден в … на линии ..

Я даже пытался использовать функцию __autoload упомянутую здесь , но без везения.

Есть идеи?

Взгляните на этот отличный учебник – я надеюсь, что это поможет

http://codeigniter.tv/a-10/Extending-the-core-MY_Controller-and-beyond

Автозагрузчик автоматически не включает другие контроллеры. вам придется включать его вручную следующим образом:

 if (!defined('BASEPATH'))exit('No direct script access allowed'); include_once(APPPATH . 'controllers/brandnewclass.php'); 

http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-base-Classes-Keeping-it-DRY Я подозреваю, что вы пытаетесь что-то подобное? Есть функция автозагрузки, которую вы можете добавить в конфигурационный файл, чтобы вы все время не нуждались в require_once ().

Если вы хотите создать пользовательский базовый контроллер и сделать там другие контроллеры, вы можете сделать это следующими способами:

  1. Создайте MY_Controller, расширяя CI_Controller в папке application / core / и добавьте другие контроллеры MY_Controller, поскольку MY_Controller будет автоматически загружен из ядра (это, я думаю, вы уже знаете, но хотите другие альтернативы.

  2. Создайте MY_Controller в приложении / ядре /. Затем создайте другой уровень контроллеров, который может быть в основном с помощью Admin_Controller и Frontend_Controller. Теперь один из этих контроллеров сделает базу для ваших фактических используемых контроллеров. Для этого MY_Controller (в приложении / ядре / расширяет CI_Controller.

    class MY_Controller расширяет CI_Controller {public function __construct () {parent :: __ construct (); }}

Тогда контроллеры Admin и Frontend будут созданы в приложении / library / и будут расширять MY_Controller, как

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

Теперь любой контроллер может расширить один из этих двух контроллеров, но для этого вам придется автозагрузить их. Для автозагрузки в этом случае может возникнуть путаница, потому что установка autoload ['libraries'] в config / autoload.php не будет работать. Эта автозагрузка работает внутри контроллера, но здесь нам нужно автозагрузку до этого, то есть в объявлении класса. Вам нужно будет установить этот код в config / config.php

 function __autoload($class) { $path = array('libraries'); if(strpos($class, 'CI_') !== 0) { foreach($path as $dir) { $file = APPPATH.$dir.'/'.strtolower($class).'.php'; if (file_exists($file) && is_file($file)) @include_once($file); } } } 

Теперь вы можете создать свой собственный контроллер

 class newController extends Admin_Controller { } 

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

  1. Третий метод – это всего лишь настройка второго, только на основании условия, о котором вы упомянули о том, что вы не используете MY_Controller. Вы можете сделать Admin_Controller или Frontend_Controller напрямую подключенным CI_Controller и не расширять MY_Controller. Это может привести к некоторой двуличности кода в обоих этих контроллерах, если это может быть
  1. Вы должны объявить класс абстрактным, так как он не должен быть создан непосредственно.
  2. Вам нужно будет изменить файл конфигурации автозагрузчика CodeIgniter и добавить к нему свой класс или изменить фактический автозагрузчик .
  3. Вы действительно должны не использовать CodeIgniter 🙂