2010-11-25 2 views
1

В моем проекте рамки Zend я хочу проверить, установлен ли файл cookie. Если это так, я хочу использовать содержимое cookie для входа пользователя.Zend: выполнить что-то перед выполнением контроллера

Поскольку для этого требуется автоматический вход в систему перед вызовом любого контроллера, я попытался поместить его в Bootstrap. Там я хочу проверить базу данных, если информация пользователя действительна. К сожалению, на данный момент адаптер базы данных по умолчанию еще не инициализирован.

Итак, мой вопрос заключается в следующем: где я помещаю эти вещи, которые должны быть выполнены до вызова любого контроллера, и после завершения инициализации/загрузки?

ответ

2

I'have не большой опыт работы с Zend Framework, но я думаю, что вы должны создать пользовательский общий контроллер для примера GenericController, который расширяет Zend_Controller_Action и поместить свой код в функции preDispatch(). Все ваши контроллеры станут подклассом вашего пользовательского контроллера, например:

class GenericController extends Zend_Controller_Action{ 
    function preDispatch(){ 
     parent::preDispatch(); 
     // put your code here 
    } 
} 
class FooController extends GenericController{ 
... 
} 
0

Используйте методы:

init() 
// and 
preDispatch() 

реализуют их в своем классе, инициализация выполняется при создании, predispatch проходит прямо перед вашим методом действия IIRC

api

На этой странице я связан над ним состояния

Примечание: Использование init() и preDispatch() В предыдущем разделе мы ввели метод init(), а в этом разделе - метод preDispatch(). В чем разница между ними и какие действия вы принимаете в каждом? Метод init() предназначен в первую очередь для расширения конструктора. Как правило, ваш конструктор должен просто устанавливать состояние объекта и не выполнять много логики. Это может включать в себя инициализацию ресурсов, используемых в контроллере (например, модели, объекты конфигурации и т. Д.) Или назначение значений, полученных из переднего контроллера, бутстрапа или реестра. Метод preDispatch() также может использоваться для установки состояния объекта или окружающей среды (например, представления, помощника действий и т. Д.), Но его основной целью является принятие решения о необходимости отправки отправленного запроса. Если нет, вы должны затем _forward() выполнить другое действие или выбросить исключение. Примечание: _forward() на самом деле не будет работать корректно при выполнении из init(), который является формализацией намерений двух методов.

+0

Но я хочу выполнить свой код перед вызовом любого контроллера. Я хочу войти в систему пользователя перед вызовом Controller1, а также до вызова Controller2. – ralle 2010-11-25 22:56:48

+0

@ralle Контроллер какого-то типа всегда вызывается для каждого запроса. Вам придется записывать их на каждый контроллер, даже если вы расширяетесь, как было предложено в другом ответе, в который вы все еще собираетесь помещать эти методы. Нет (без редактирования Zend) глобального местоположения (кроме бутстрапа) для выполнения это. И, как вы сказали, так как это пользовательский auth, ставить int bootstrap не самый простой. Хотя вы можете загрузить БД в бутстрап, THEN выполните аутентификацию. – 2010-11-26 03:19:07

Смежные вопросы