Zend Framework - Где инициализировать сеанс, когда маршрутизатору необходим доступ к нему - PullRequest
0 голосов
/ 09 июля 2010

Я работаю в проекте, который часто использует сессию.У нас есть обработчик базы данных (стандартный от Zend), и в настоящее время у меня есть эта инициализация (обработчик базы данных + начало сеанса) в плагине для preDispatchLoop.Ранее это было в preDispatch, но из-за того, что оно вызывалось для каждого действия (включая те, которые были включены в действие «переадресовано», это вызывало у меня проблемы.

Моя проблема в том, что я начал работать в интернационализации и начал использовать маршрутизатордля определения языка в URI: мы используем форму / язык / контроллер / действие).Маршрутизатор хотел бы использовать сеанс для чтения / сохранения языка.Но, как вы, наверное, знаете, сначала идет маршрутизатор, а затем (до / после) диспетчерский материал.

Итак, возникает вопрос: почему бы не переместить инициализацию сеанса в загрузочную систему?это потому, что он был там раньше, но мне пришлось переместить его, потому что мне нужно проверить, что база данных (помните, что сеанс использует базу данных) доступна для предотвращения ошибок.И если есть ошибка, я просто перенаправить (запрос-> setController / setAction error).Если я возвращаю код инициализации сеанса в загрузчик, я не могу выполнить перенаправление, если база данных недоступна.

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

Я думаю, что сессия не должнане использовать так рано.Их не следует вызывать при начальной загрузке, поскольку они еще не полностью осведомлены о запрашиваемом контроллере / действии.Я думаю, что для получения языка я мог бы просто положиться на куки (руководство) и получить его оттуда (а также от URI).И если в конце концов когда-нибудь информация о сеансе должна быть использована при начальной загрузке, я бы использовал глобальную переменную.

Что вы думаете?есть ли ошибка в способе управления приложением?

Некоторые вопросы:

Zend Framework: получение объекта запроса в начальной загрузке

Лучший способ справиться с обработкой сеанса в Zend Framework

(Zend версия 1.9.6, не использующая Application или Bootstrap)

1 Ответ

1 голос
/ 26 июля 2010

Я бы переместил инициализацию сеанса и подключение БД к загрузчику.
Если вы не можете подключиться к БД во время загрузки, это должно считаться ошибкой низкого уровня.Не исключено, что это произойдет в рабочей среде.
Просто поместите процесс начальной загрузки в блок try catch, чтобы вы могли вывести страницу с ошибкой.

// in your index.php
try {
    $application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
    );

    $application->bootstrap()
                ->run();

} catch (Exception $e) {
    header('Content-type: text/html; charset=utf-8');
    header('HTTP/1.1 503 Service Unavailable');
    header("Retry-After: 3600");
    // Output some error page.
    echo "<html><head><title>System Error</title></head><body>...</bod></html>";
?>
...