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