【问题标题】:CakePHP 3: Accessing current user in modelCakePHP 3:访问​​模型中的当前用户
【发布时间】:2017-08-27 06:41:53
【问题描述】:

由于我是 CakePHP 的新手,我有一些简单的问题我无法弄清楚。

我使用的是 CakePHP 3.4。我尝试编写一个简单的记录器功能。应用到记录的每个更改,我都希望记录到 ChangeLog 模型中。

使用 afterSave() 事件,我有以下代码:

public function afterSave($event, $entity, $options) {
  $logTable = TableRegistry::get('ChangeLogs');
  foreach ($entity->getDirty() as $key) {
    if($key != 'modified') {
      $record = $logTable->newEntity();
      $record->previous_value = $entity->getOriginal($key);
      $record->new_value = $entity[$key];
      $record->table_name = 'Stars';
      $record->column_name = $key;
      $record->row_id = $entity->id;
      $record->user_id = [what should i put here?]
      $record->user_id = $_SESSION['Auth']['user']['id'];
      $logTable->save($record);
    }
  }

效果很好,但是我也想知道是哪个用户进行了操作,不知道如何在Model中获取当前用户。

我尽量避免在控制器中传递参数,因为我希望自动检测用户,并且作为开发人员,我不想每次尝试在控制器中更改/添加新功能时都记住它。

【问题讨论】:

    标签: authentication cakephp logging cakephp-3.0 audit-logging


    【解决方案1】:

    不要直接在 CakePHP 中摆弄超全局变量,这在某些时候肯定会咬到你,尤其是在测试环境中!始终使用抽象方法(如the session object)来访问此类数据!

    话虽如此,您可以使用事件将当前用户注入模型回调/事件流。例如全局注册到Model.afterSave,并将当前用户传递到选项中。

    这是一个演示原理的基本示例。在你的应用控制器中想象这样的事情:

    use Cake\Datasource\EntityInterface;
    use Cake\Event\Event;
    use Cake\Event\EventManager;
    
    // ...
    
    public function initialize()
    {
        parent::initialize();
    
        // ...
    
        EventManager::instance()->on(
            'Model.afterSave',
            ['priority' => -1],
            function (Event $event, EntityInterface $entity, \ArrayObject $options) {
                // retrieve the user id from the auth component
                $options['user_id'] = $this->Auth->user('id');
            }
        );
    }
    

    鉴于-1 的优先级(默认优先级为10),它将在该事件的模型回调之前被调用,因此在您的表类中,您可以通过@987654333 访问user_id @参数。

    $record->user_id = $options['user_id'];
    

    对于更可重用的东西,您可能会使用自定义侦听器类。还可以查看 Auth.afterIdentify、Model.initialize 和 Controller.intialize/startup 等事件,这些事件可以用于注册模型事件侦听器并检索当前用户。

    另见

    【讨论】:

      【解决方案2】:

      此解决方案似乎允许您将登录用户传递到模型层:

      https://github.com/UseMuffin/Footprint

      它没有像上面的解决方案那样通过事件挂钩到模型层。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 2015-08-14
        • 2012-03-30
        • 1970-01-01
        • 1970-01-01
        • 2019-03-25
        • 1970-01-01
        相关资源
        最近更新 更多