【问题标题】:cakephp database logger - how to access controller variable?cakephp 数据库记录器 - 如何访问控制器变量?
【发布时间】:2013-01-11 09:42:51
【问题描述】:

我正在按照 cakephp 文档来实现数据库记录器功能。在

中创建记录器类后,我得到了一切工作
app/Lib/Log/Engine/DatabaseLogger.php 

并将这些行添加到引导程序

CakeLog::config('otherFile', array(
'engine' => 'DatabaseLogger',
'model' => 'LogEntry',
// ...
));

之后我可以通过调用登录到数据库

CakeLog::info(message);

一切正常,但是我在尝试自动记录用户的用户名和 IP 地址时遇到了问题。我在网上搜索了许多解决方案,但似乎找不到答案。是否可以访问DatabaseLogger类中的控制器?

【问题讨论】:

    标签: php cakephp logging cakephp-2.0


    【解决方案1】:

    您不需要访问控制器

    你需要的信息实际上是全局的,你不需要访问控制器对象来获取它。

    客户端 IP

    您可以使用Router::getRequest 方法获取当前请求对象并从中检索客户端IP:

    $request = Router::getRequest();
    $ip = $request->clientIp();
    

    或者干脆使用env方法:

    $ip = env('REMOTE_ADDR');
    

    当前用户名

    为此,只需使用static session interface

    $name = CakeSession::read('Auth.User.name');
    

    【讨论】:

      【解决方案2】:

      这有望让您朝着正确的方向前进。我目前正在将我的一些 CakePHP 应用程序升级到 2.2。我对此不是 100% 确定的,但这似乎是关于解决这个问题的方法。我正在考虑使用数据库日志记录,我喜欢你的想法,所以让我知道它是如何工作的。如果没有,请提供反馈,我会深入挖掘。 ;)

      创建您的 LogEntry 模型(数据库表)以包含用户名和 IP 地址的字段。

      创建一个 AppController。在 beforeFilter 方法中,将用户的 IP 地址放在他们的会话中。 CakeRequest 对象将包含他们的 IP 地址。

      $this->request->clientIp();
      

      在该模型的 beforeSave() 方法中,您将收集用户名和 IP 地址。

      访问用户名字段(假设您使用 Auth 组件和 clientIp 作为其 ip 地址的键):

      App::import('Component', 'Session');
      $Session = new SessionComponent();
      $user = $Session->read('Auth.User');
      $ip = $Session->read('clientIp');
      

      将这些分配给正确的字段以便保存。

      【讨论】:

      • 在 2.x 中,您不会在这里使用会话作为组件 - 只是直接使用数据源类。此外,在 2.x 中,内部类不再有 App::import()(仅适用于供应商文件)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多