代码之家  ›  专栏  ›  技术社区  ›  besercer

CakePHP 3验证范围不工作-我没有收到错误消息

  •  1
  • besercer  · 技术社区  · 8 年前

    我试图验证我的实体,但它不起作用。只有isUnique有效。但忽略了noEmpty、minLength和range。我也想显示这些消息。我做错了什么?还是theruleschecker覆盖了验证?

    城市资产。php

    <?php
    namespace App\Model\Table;
    
    use Cake\ORM\Query;
    use Cake\ORM\RulesChecker;
    use Cake\ORM\Table;
    use Cake\Validation\Validator;    
    
    class CitiesTable extends Table
    {
    
        public function initialize(array $config)
        {
            parent::initialize($config);
    
            $this->table('cities');
            $this->displayField('name');
            $this->primaryKey('id');
    
            $this->addBehavior('Timestamp');
    
            $this->hasMany('Fields', [
                'foreignKey' => 'city_id'
            ]);
        }    
    
        public function validationDefault(Validator $validator)
        {
            $validator
                ->integer('id')
                ->allowEmpty('id', 'create');
    
            $validator
                ->requirePresence('name', 'create')
                ->notEmpty('name')
                ->add('name', [
                    'length' => [
                        'rule' => ['minLength', 15],
                        'message' => 'Titles need to be at least 10 characters long',
                    ]
                ])
                ->lengthBetween('username', [15, 20])
                ->minLength('name',15,'TestMessage');
    
            $validator
                ->integer('fields_per_pieces_x')
                ->range('fields_per_pieces_x',[1,5],'TeestMessage')
                ->requirePresence('fields_per_pieces_x', 'create')
                ->notEmpty('fields_per_pieces_x');
    
            $validator
                ->integer('fields_per_pieces_y')
                ->requirePresence('fields_per_pieces_y', 'create')
                ->notEmpty('fields_per_pieces_y');
    
            $validator
                ->integer('field_pieces')
                ->requirePresence('field_pieces', 'create')
                ->notEmpty('field_pieces');
    
            return $validator;
        }
    
        public function buildRules(RulesChecker $rules){
            $rules->add($rules->isUnique(['name']));
            return $rules;
        }
    }
    

    还有这个:

    $map['city'] = $this->generateCity('Kantosddd', -2, -2, -4);
    
    pr($map);
    die();
    

    显示以下内容:

    Array
    (
        [city] => App\Model\Entity\City Object
            (
                [name] => Kantosddd
                [fields_per_pieces_x] => -2
                [fields_per_pieces_y] => -2
                [field_pieces] => -4
                [[new]] => 1
                [[accessible]] => Array
                    (
                        [*] => 1
                    )
    
                [[dirty]] => Array
                    (
                        [name] => 1
                        [fields_per_pieces_x] => 1
                        [fields_per_pieces_y] => 1
                        [field_pieces] => 1
                    )
    
                [[original]] => Array
                    (
                    )
    
                [[virtual]] => Array
                    (
                        [get] => Array
                            (
                                [0] => fields_per_pieces_all
                                [1] => fields_in_x
                                [2] => fields_in_y
                                [3] => count_of_all_fields
                            )
    
                    )
    
                [[errors]] => Array
                    (
                        [name] => Array
                            (
                                [_isUnique] => This value is already in use
                            )
    
                    )
    
                [[invalid]] => Array
                    (
                        [name] => Kantosddd
                    )
    
                [[repository]] => Cities
            )
    
    )
    

    generateCity函数

    function generateCity(string $name, int $fieldsPerPiecesX, int $fieldsPerPiecesY, int $fieldPieces ): City
        {
    
            $citiesTable = TableRegistry::get('Cities');
    
            $city = $citiesTable->newEntity();
    
            $city->set('name', $name);
            $city->set('fields_per_pieces_x', $fieldsPerPiecesX);
            $city->set('fields_per_pieces_y', $fieldsPerPiecesY);
            $city->set('field_pieces', $fieldPieces);
    
            if(!$citiesTable->save($city)){
                foreach($city->errors() as $fields => $field){
                    foreach($field as $rule => $message){
                        $this->Flash->error($fields.": ".$message);
                    }
                }
            }
            return $city;
        }
    

    感谢您的帮助:)

    1 回复  |  直到 8 年前
        1
  •  0
  •   Greg Schmidt    8 年前

    当您使用 set 函数,不进行验证,只执行规则。尝试以下操作:

    $city = $citiesTable->newEntity([
        'name' => $name,
        'fields_per_pieces_x' => $fieldsPerPiecesX,
        'fields_per_pieces_y' => $fieldsPerPiecesY,
        'field_pieces' => $fieldPieces
    ]);
    

    或者,等效地,

    $city = $citiesTable->newEntity();
    $city = $citiesTable->patchEntity($city, [
        'name' => $name,
        'fields_per_pieces_x' => $fieldsPerPiecesX,
        'fields_per_pieces_y' => $fieldsPerPiecesY,
        'field_pieces' => $fieldPieces
    ]);