Zend framework - где инициализировать сеанс, когда маршрутизатору требуется доступ к нему

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

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

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

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

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

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

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

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

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

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


person Mr X Colombia    schedule 09.07.2010    source источник
comment
Непонятно, почему вы не можете загрузить БД, затем сеансы, а затем выполнить маршрутизацию. Зачем вам нужен сеанс для перенаправления, если база данных недоступна?   -  person Tim Fountain    schedule 09.07.2010
comment
Потому что, если у меня есть ошибка, я не могу перенаправить. У меня нет прямого доступа к объекту запроса в начальной загрузке, и хотя я мог его получить, я не должен (это то, что я читал повсюду). Вот почему я переместил код инициализации db (и сеанса) в плагин, чтобы иметь возможность перенаправлять при ошибке. НО эти плагины вызываются только после маршрутизатора (см. Поток в framework. zend.com/manual/en/zend.controller.basics.html). Мне не нужен сеанс для перенаправления при ошибках. В конце концов, я просто прекратил использовать информацию о сеансе при начальной загрузке.   -  person Mr X Colombia    schedule 15.07.2010


Ответы (1)


Я бы переместил инициализацию сеанса и подключение к базе данных в начальную загрузку.
Если вы не можете подключиться к своей базе данных во время начальной загрузки, это должно считаться ошибкой низкого уровня. Это не исключено в производственной среде.
Просто заключите процесс начальной загрузки в блок 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>";
?>
person Benjamin Cremer    schedule 26.07.2010
comment
Спасибо. Я также думаю, что db и session должны принадлежать к начальной загрузке, но тогда отправка заголовков и эхо в файле начальной загрузки (или любом включенном файле) не является «способом Zend» для отображения страницы с ошибкой. И у нас нет (прямого) доступа к запросу, чтобы сделать редирект. У меня есть контроллер ошибок с журналированием, отправкой электронной почты и красивым представлением, которое там вызывается, я просто хотел сделать его «способом Zend». Я думаю, это проблема курицы и яйца. - person Mr X Colombia; 27.07.2010
comment
Я тоже использую контроллер ошибок, логин и т. Д. Но некоторые ошибки вы не можете уловить и аккуратно обработать в Zend Way, потому что они появляются слишком рано. Подумайте, не читается ли ваш application.ini. Что теперь делает ваше приложение? Так что в любом случае требуется обработка на низком уровне. - person Benjamin Cremer; 27.07.2010