如何将当前用户 ID 传递给 CakePHP 模型的构建规则方法



我将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。

好的,在工作了更多之后,我找到了如何在构建规则中检索user_id。可能对某人有帮助。

在控制器中执行此操作

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

然后把它放在你的构建规则方法中

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;
}

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

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

$this->getEventManager()->on('Model.beforeRules', function (
CakeEventEvent $event,
CakeDatasourceEntityInterface $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.

相关内容

  • 没有找到相关文章

最新更新