我在CakePHP 3.8中使用了AuthComponent,现在我需要在Model buildRules方法中做一些逻辑,但为此我需要获得当前的用户ID.有什么方法可以在不使用黑客的情况下传递retrieve它,比如直接从会话中访问。https:/book.cakephp.org3encore-librariesvalidation.html#using-custom-validation-rules。
而且它对验证有效,但是,我无法从构建规则的内部访问验证器。
当我按照这里的描述做时,我得到一个空对象。https:/book.cakephp.org3enormvalidation.html#using-validation-as-application-rules。
我似乎可以附加新的验证规则,但无法检索 "通过 "提供者以获得用户ID。
这似乎是一件微不足道的事情,但我花了相当多的时间试图以一种适当的方式获得ID。
好了,经过努力,我发现如何在构建规则中检索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;
}
正确的处理方式通常是使用以下两种方式 活动,或保存选项。
例如,要使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
.