Расширение IndexController с помощью BaseController в Zend - PullRequest
10 голосов
/ 02 октября 2009

Я пытаюсь расширить свои контроллеры глобальным базовым контроллером как таковым:

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: класс «BaseController» не найден в /var/www/Zend/project/application/controllers/IndexController.php в строке 3

Есть идеи, как заставить Zend "увидеть" этот контроллер?

Ответы [ 4 ]

6 голосов
/ 12 октября 2009

Autoloader

Настройте автозагрузчик и зарегистрируйте свою библиотеку, которая должна быть помимо библиотеки 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
{
}

поэтому, в основном, когда вы хотите расширить каркас, вы сохраняете параллельную структуру в своей собственной библиотеке.

3 голосов
/ 02 октября 2009

Я бы выделил ее в вашу собственную библиотеку, то есть создаю библиотеку файлов / YourApp / Controller / Action.php и, следовательно, назову ее YourApp_Controller_Action extends Zend_Controller_Action. Оттуда вы можете разместить контроллеры там, где они должны быть, и позволить им расширять YourApp_Controller_Action в пользу Zend_Controller_Action.

Чтобы найти файл, вы должны полагаться на автозагрузчик, чтобы искать не только внутри библиотеки / Zend, но и в библиотеке / YourApp. То есть поищите set_include_path в вашей начальной загрузке.

При использовании этой техники вы должны иметь в виду, что ваш пользовательский "базовый контроллер" может раздуться от методов, которые не должны наследоваться всеми вашими контроллерами.

2 голосов
/ 27 сентября 2010

Еще более быстрым решением (и концептуально более правильным) НЕ является создание базовых контроллеров вообще:)

У вас есть общие действия? Используйте помощников действия . У вас есть какой-то функционал, который должен быть запущен автоматически? Используйте плагины контроллера .

Конструкция Контроллеры ZF были сделаны максимально гибкими, и ограничить себя наследованием (и соединением, которое оно приносит) просто не лучшая возможная стратегия.

1 голос
/ 12 октября 2009

быстрое решение, которое не использует преимущества функции автозагрузчика, заключается в require_once '/path/to/BaseController.php' в файле контроллера индекса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...