【问题标题】:How to pass current user ID to buildRules method of CakePHP model如何将当前用户 ID 传递给 CakePHP 模型的 buildRules 方法
【发布时间】:2020-06-11 20:20:22
【问题描述】:

我在 CakePHP 3.8 中使用 AuthComponent,现在我需要在 Model buildRules 方法中执行一些逻辑,但为此我需要获取当前用户 ID。 有什么方法可以在不使用诸如直接从会话访问之类的技巧的情况下传递/检索它。 我知道可以通过控制器中的验证器传递 id,如 CakePHP 的文档中所述 https://book.cakephp.org/3/en/core-libraries/validation.html#using-custom-validation-rules

它适用于验证,但是,我无法从构建规则内部访问验证器。

当我按照这里的描述进行操作时,我得到一个空对象。 https://book.cakephp.org/3/en/orm/validation.html#using-validation-as-application-rules

我似乎能够附加新的验证规则,但无法检索“通过”提供程序来获取用户 ID。

这似乎是一件微不足道的事情,但我花了好几个小时试图以正确的方式获取 id。

【问题讨论】:

    标签: php cakephp model userid build-rules


    【解决方案1】:

    好的,经过一番努力,我找到了如何在构建规则中检索 user_id。可能对某人有帮助。

    在控制器中执行此操作

             $this->ExampleModel->validator('default')->provider('passed', [
                'current_user' => $this->Auth->user('id')
             ]);
    

    然后把它放到你的 buildRules 方法中

    public function buildRules(RulesChecker $rules)
    {
        $user_id = $this->validator('default')->provider('passed')['current_user'];
        $rules->add(
           function ($entity, $options) use($user_id) {
    
             //return boolean for pass or fail
            },
            'ruleName',
            [
              'errorField' => 'some_id',
              'message' => 'Some ID field is inconsistent with App logic.'
            ]
        );
    
        return $rules;
    }
    

    【讨论】:

      【解决方案2】:

      处理此问题的正确方法通常是使用events 或保存选项。

      例如,要使 ID 可用于所有表的应用程序规则,您可以执行以下操作:

      $this->getEventManager()->on('Model.beforeRules', function (
          \Cake\Event\Event $event,
          \Cake\Datasource\EntityInterface $entity,
          \ArrayObject $options
      ) {
          $options['current_user'] = $this->Auth->user('id');
      });
      

      它将相应地在规则的$options 参数中可用,即$options['current_user']

      对于特定的保存操作,您可以将其传递给save() 调用的选项:

      $this->ExampleModel->save($entity, [
          'current_user' => $this->Auth->user('id')
      ]);
      

      还有一些插件可以帮助您,例如 muffin/footprint

      【讨论】:

      • 这可能是正确的方法,但我更喜欢通过验证器,因为它让阅读代码的任何人都更清楚目的,否则如果它通过 save 方法可能会对它传递的目的感到困惑。
      • @user3785288 我不认为事情会这样发展,熟悉CakePHP 的人会注意到有问题,而不熟悉的人会“学习”解决问题的错误方法。此外,一旦验证器强制执行记录的参数类型,代码就会中断,正如它所期望的 object|string,数组不是有效的验证提供程序,代码分析器工具会抱怨代码违反了 API 合同。
      • 我写的示例代码取自 CakePHP 的官方文档。我想人们也可以使用 eventManager 将当前用户传递给验证对象,但这种方式在官方文档中是如何描述的。此外,对我来说,在应用程序的任何地方插入 eventManager 代码在语义上与在任何地方静态调用任何对象没有什么不同。
      • @user3785288 要么需要更改说明书,要么需要更新代码和 API 文档以专门支持数组(甚至没有任何测试) - 我会打开一个票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2015-09-15
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多