Расширение IndexController с помощью BaseController в Zend
Я пытаюсь расширить мои контроллеры с помощью глобального базового контроллера как такового:
class BaseController extends Zend_Controller_Action {
// common controller actions
public function listAction() {
// do stuff
}
}
class IndexController extends BaseController {
// index controller specific actions
}
class LoginController extends BaseController {
// login controller specific actions
}
Но я получаю эту ошибку: PHP Неустранимая ошибка: Class 'BaseController' не найден в /var/www/Zend/project/application/controllers/IndexController.php в строке 3
Любые идеи о том, как заставить Zend "видеть" этот контроллер?
Ответы
Ответ 1
Автозагрузка
Установите автозагрузчик и зарегистрируйте свою библиотеку, которая должна быть, помимо библиотеки Zend, автозагрузчиком, как это делается (в вашем bootstrap.php после установки пути включения):
//AutoLoad loads classes automatically if they are used
require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Mylibrary_');
Соглашения о присвоении имен Zend
Затем вы должны переименовать свой BaseController следующим образом
/Zend (folder)
/Mylibrary (folder)
/Controller (folder)
Action.php <-- this is your basecontroller file
который содержит:
class Mylibrary_Controller_Action extends Zend_Controller_Action
{
}
и ваши обычные контроллеры в папке контроллера:
class IndexController extends Mylibrary_Controller_Action
{
}
поэтому в основном, когда вы хотите расширить структуру, вы сохраняете параллельную структуру в своей собственной библиотеке.
Ответ 2
Я бы разложил его в свою собственную библиотеку, т.е. создал библиотеку файлов /YourApp/Controller/Action.php и, следовательно, назвал ее YourApp_Controller_Action extends Zend_Controller_Action
. Оттуда вы можете разместить контроллеры там, где они должны быть, и позволить им расширять YourApp_Controller_Action
в пользу Zend_Controller_Action
.
Чтобы найти файл, вы должны полагаться на автозагрузчик, чтобы смотреть не только внутри библиотеки /Zend, но также и в библиотеке /YourApp. То есть найдите set_include_path
в своей начальной загрузке.
С помощью этой техники вы должны иметь в виду, что ваш пользовательский "базовый контролер" может раздуваться с методами, которые не должны наследовать не все ваши контроллеры.
Ответ 3
Еще более быстрое решение (и концептуально более корректное) - это НЕ создавать базовые контроллеры вообще:)
У вас есть общее действие? Используйте помощники действий. У вас есть некоторые функции, которые должны быть автозапуском? Используйте плагины контроллера.
По дизайну ZF-контроллеры были сделаны как можно более гибкими, и ограничение себя наследованием (и его сочетанием) - это не самая лучшая стратегия.
Ответ 4
быстрое решение, не использующее функциональность автозагрузчика, - это
require_once '/path/to/BaseController.php' в файле index-controller.
Если у вас настроен автоконтроллер, он не может его найти, поэтому вам стоит подумать о том, что неправильно. Попробуйте предыдущий подход и сообщите о результатах.