0

我将 AuthComponent 与 CakePHP 3.8 一起使用,现在我需要在 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。

4

2 回答 2

0

处理此问题的正确方法通常是使用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规则的参数中可用,即 as $options['current_user']

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

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

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

于 2020-06-11T21:41:06.113 回答
0

好的,在工作了一点之后,我发现了如何在构建规则中检索 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;
}
于 2020-06-11T20:45:32.397 回答