编写CakePHP模型的自定义规则

时间:2017-01-01 16:10:24

标签: cakephp cakephp-3.0

use App\Model\Rule\CustomIsUnique;

$rules->add(new CustomIsUnique(['item_id', 'manufacture_unit_id']), [
    'errorField' => 'item_id',
    'message' => 'Item Unit must be unique.'
]);

CustomIsUnique 上,我复制了 IsUnique

的粘贴代码
Cake\ORM\Rule\IsUnique;

但是如何在 __ invoke 方法中扩展或添加更多操作?

更新 ::

   public function __invoke(EntityInterface $entity, array $options)
{
    $result = parent::__invoke($entity, $options);
    if ($result) {
        return true;
    } else {
        if ($options['type'] == 'item_units') {
            $data = TableRegistry::get('item_units')->find()
                ->where(['item_id' => $entity['item_id'],
                    'manufacture_unit_id' => $entity['manufacture_unit_id'],
                    'status !=' => 99])->hydrate(false)->first();
            if (empty($data)) {
                return true;
            }
        } elseif ($options['type'] == 'production_rules') {
            $data = TableRegistry::get('production_rules')->find()
                ->where(['input_item_id' => $entity['input_item_id'],
                    'output_item_id' => $entity['output_item_id'],
                    'status !=' => 99])->hydrate(false)->first();
            if (empty($data)) {
                return true;
            }
        } elseif ($options['type'] == 'prices') {
            $data = TableRegistry::get('prices')->find()
                ->where(['item_id' => $entity['item_id'],
                    'manufacture_unit_id' => $entity['manufacture_unit_id'],
                    'status !=' => 99])->hydrate(false)->first();
            if (empty($data)) {
                return true;
            }
        }
    }
}

这就是我为不同型号实施的方式,并传递了额外的参数以及选项数组。我认为这不是做这件事的好方法。

1 个答案:

答案 0 :(得分:2)

如果要扩展核心应用程序规则,可以执行以下操作:

<?php
use App\Model\Rule;

class CustomIsUnique extends Cake\ORM\Rule\IsUnique
{
    public function __invoke(EntityInterface $entity, array $options)
    {
        $result = parent::__invoke($entity, $options);
        if ($result) {
            // the record is indeed unique
            return true;
        }
        // do any other checking here
        // for instance, checking if the existing record 
        // has a different deletion status than the one
        // you are inserting
    }
}

这将允许您为您的应用程序添加任何其他逻辑。