Широкая переменная приложения ZF2 (настраиваемый уникальный идентификатор запроса)

Я использую Zend-Framework2 и хочу регистрировать информацию о запросе. Не все серверы предоставляют $_SERVER['UNIQUE_ID'], поэтому я хотел бы сгенерировать свой собственный (см. http://en.wikipedia.org/wiki/Universally_unique_identifier для формата).

В ZF2 все делается внутри модулей, но я хотел бы создать переменную или константу для всего приложения с уникальным идентификатором. Я могу добавить его в index.php, но я думаю, что это не тот путь... Другой вариант заключается в том, что генерация уникального идентификатора запроса выполняется в методе onBootstrap вызываемого модуля, но тогда я Я повторяюсь, и это нежелательно, я думаю.

Где я должен в идеале поместить фрагмент кода для генерации UUID и добавить его в качестве переменной/константы для всего приложения?

Заранее спасибо!

Аналогичный вопрос: регистрировать каждый запрос в ZF2


person ivodvb    schedule 29.03.2013    source источник


Ответы (2)


Другой вариант - генерация уникального идентификатора запроса происходит в методе onBootstrap вызываемого модуля, но тут я повторяюсь, а это, я думаю, нежелательно.

Я думаю, что вы неправильно понимаете модули здесь Иво. Метод onBootstrap вызывается для каждого модуля, у которого он есть, независимо от того, какой модуль в конечном итоге разрешается и отправляется для текущего запроса. Дело не в том, что маршрутизатор находит контроллер и затем загружает этот единственный модуль, все они загружаются с помощью ModuleManager до того, как произойдет какая-либо маршрутизация.

С этой точки зрения вы можете разместить его в модуле, генерируя UUID при начальной загрузке. Чтобы сделать его доступным для всего сайта удобным способом, установите это значение как службу, и тогда оно будет доступно в любом месте из диспетчера служб.

public function onBootstrap(EventInterface $e) {
    $sm = $e->getApplication()->getServiceManager();
    $uuid = isset($_SERVER['UNIQUE_ID']) ? $_SERVER['UNIQUE_ID'] : yourUUIDGeneratingMethod();
    $sm->setService('UUID', $uuid);
}
person Crisp    schedule 29.03.2013
comment
Спасибо, это было решение! Я действительно неправильно понял поведение метода onBootstrap. - person ivodvb; 29.03.2013

Ну, вы можете добавить переменную приложения в config/autoload/global.php. (Однако я думаю, что весь массив конфигурации объединяется в процессе загрузки страницы. Поэтому другая конфигурация также должна работать.) Для генератора UUID я бы предложил создать модуль с именем ProjectServices в папке поставщика и определить сервис для генерации uuid (пример. vendor\ProjectServices\src\ProjectServices\Service\UUIDGenerate.php) в него. Вы можете определить дополнительные службы, такие как глобальный регистратор, в соответствии с вашими требованиями в этой папке.

person kuldeep.kamboj    schedule 29.03.2013
comment
Итак (просто чтобы проверить, понимаю ли я вашу идею), вы предлагаете сделать вызов модуля поставщика из config/autoload/global.php? - person ivodvb; 29.03.2013
comment
Если это неизменяемая переменная для всего приложения, то запрос должен быть передан от поставщика к global.php. Если это временная переменная, сгенерированная из вашего генератора UUID, то лучше всего сгенерировать ее, а затем либо получать ее из метода получения каждый раз, либо сохранять в сеансе и получать оттуда. - person kuldeep.kamboj; 29.03.2013