Все, что я пытаюсь сделать, это нечто довольно простое:
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 ().
Если вы хотите создать пользовательский базовый контроллер и сделать там другие контроллеры, вы можете сделать это следующими способами:
Создайте MY_Controller, расширяя CI_Controller в папке application / core / и добавьте другие контроллеры MY_Controller, поскольку MY_Controller будет автоматически загружен из ядра (это, я думаю, вы уже знаете, но хотите другие альтернативы.
Создайте 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 { }
Это наиболее рекомендуемый метод, который делает вашу структуру довольно чистой и эффективной. Может приложить некоторые усилия в понимании в первый раз, но определенно стоит того.