【问题标题】:ZF2 application wide var (custom unique request id)ZF2 应用程序范围的 var(自定义唯一请求 ID)
【发布时间】:2013-03-29 09:47:01
【问题描述】:

我正在使用 Zend-Framework2,我想记录有关请求的信息。 并非所有服务器都提供 $_SERVER['UNIQUE_ID'],所以我想自己生成(格式请参见http://en.wikipedia.org/wiki/Universally_unique_identifier)。

在 ZF2 中,一切都在模块内完成,但我想创建一个应用程序范围的变量或常量,其中包含唯一 ID。 我可以将它添加到 index.php,但我认为这不是要走的路......另一个选择是唯一请求 ID 的生成是在被调用模块的 onBootstrap 方法中完成的,但是我'我在重复自己,我认为这是不可取的。

理想情况下,我应该将这段代码放在哪里来生成 UUID 并将其添加为应用程序范围的变量/常量?

提前致谢!

类似问题:Log each request in ZF2

【问题讨论】:

    标签: php zend-framework2 zend-framework-modules zend-log


    【解决方案1】:

    另一种选择是唯一请求 ID 的生成是在被调用模块的 onBootstrap 方法中完成的,但是我在重复自己,我认为这是不可取的。

    我认为您对 Ivo 的模块有误解。 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);
    }
    

    【讨论】:

    • 谢谢,这就是解决方案!我确实误解了 onBootstrap 方法的行为。
    【解决方案2】:

    您可以将应用程序范围的变量添加到 config/autoload/global.php。 (但是我认为所有配置数组都在页面加载过程中合并。所以其他配置也应该工作。)对于 UUID 生成器,我建议将一个名为 ProjectServices 的模块放入供应商文件夹并为 uuid 生成定义服务(例如。 vendor\ProjectServices\src\ProjectServices\Service\UUIDGenerate.php) 到那个。您可以根据需要在该文件夹中定义更多服务,例如全局记录器。

    【讨论】:

    • 所以(只是为了检查我是否理解您的想法)您建议从 config/autoload/global.php 调用供应商模块?
    • 如果它是应用程序范围内不可更改的变量,则请求必须从供应商转到 global.php。如果它是从您的 UUID 生成器生成的临时变量,那么您最好生成它,然后每次从 getter 方法获取它,或者将其存储到会话中并从那里获取。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2021-10-24
    • 2012-11-13
    • 1970-01-01
    • 2018-03-08
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多