Validation CakePHP 3-开关构建规则集

Validation CakePHP 3-开关构建规则集,validation,cakephp-3.0,build-rules,Validation,Cakephp 3.0,Build Rules,我正在制作一个应用程序,用户可以在其中创建活动,其他用户可以订阅活动。新活动必须通过管理员小组进行审批,只有管理员才能访问该小组 应锁定已批准的活动,以便用户无法更改这些活动。只有通过管理面板批准的活动才应可编辑 为了实现这一点,我们制定了以下构建规则: public function buildRules(RulesChecker $rules) { // Check if activity wasn't locked $rules->add(function ($ent

我正在制作一个应用程序,用户可以在其中创建活动,其他用户可以订阅活动。新活动必须通过管理员小组进行审批,只有管理员才能访问该小组

应锁定已批准的活动,以便用户无法更改这些活动。只有通过管理面板批准的活动才应可编辑

为了实现这一点,我们制定了以下构建规则:

public function buildRules(RulesChecker $rules)
{
    // Check if activity wasn't locked
    $rules->add(function ($entity, $settings)
    {
        // Return false if already approved before
        return !$entity->approved || $entity->isDirty('approved');
    }, 'alreadySubscribed', ['errorField' => 'name', 'message' => 'Activity has been approved and is now locked']);


    return $rules;
}
(BuildRule而不是validation rule,因为当未修改
approved
字段时,验证也应生效,因此不属于验证的一部分。)

上面给出的规则也阻止管理员修改活动,因此我的问题是:


您可以像更改验证方法一样在表中的构建规则之间切换吗?

不太可能,有一个
模型。buildRules
事件可用于添加规则,仅此而已

我不确定根据模型外部的状态来调整多个应用程序规则是否是一个好主意。您试图实现的目标听起来像是访问控制,即授权,我建议相应地实施检查

看看,它允许您实施非常灵活的策略来处理此类情况。或者,还有auth组件提供的老式授权功能,或者(高度未记录的)插件

如果您的授权确实非常基本,即“管理区域=允许编辑””和“非管理区域=不允许编辑””,即您的应用程序中可能只有这一点需要进行检查,那么您可能不需要太复杂的东西,例如,将选项传递到保存过程中。选项将被传递到规则中,您可以在其中相应地检查它们,例如:

$options = [
    'updateApproved' => true
];
$Model->save($entity, $options);
这样,只有通过
updateApproved
选项传递
true
时,才能保存已批准的实体。如前所述,这并不是一个非常好的解决方案,无论如何,我建议您看看,了解如何正确地实现授权

另见


我想@ndm的解决方案更为正式。我最终得到了一个不同的解决方案,我想先尝试一下。
基本上,我在活动模型中添加了一个标志:

class ActivitiesTable extends Table
{

    /** @var bool Flag whether admin is modifying the table */
    private $_admin = false;

    // ...
并使规则的建立依赖于它:

    if (!$this->_admin)
    {
        $rules->add(function ($entity, $settings)
        {
            // ...
然后,在控制器中,您可以将模型切换到管理模式,并保存否则将失败的实体:

$this->Activities->_admin = true;

$this->Activities->save($activity);
$this->Activities->_admin = true;

$this->Activities->save($activity);