2015-04-15 2 views
0

Я создал валидатор, и я пытаюсь сделать это проверить, если поле является уникальным, я думаю, что у меня есть правила в порядке, но он бросает фатальную ошибку:CakePHP 3 Проверки validateUnique ошибка

Fatal error: Using $this when not in object context in route/app/vendor/cakephp/cakephp/src/ORM/Table.php on line 2113

Также строгие стандарты сказать мне это:

Non-static method Cake\ORM\Table::validateUnique() should not be called statically [CORE/src/Validation/ValidationRule.php, line 140]

Является ли это ошибка в торт 3? Я использую только основные методы ...

Мой торт версия 3.0.1

Код валидатор:

<?php namespace App\Model\Validation; 

use Cake\Validation\Validator; 

class SiteValidator extends Validator 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
     $this->provider('table', 'Cake\ORM\Table'); 

     $this 
     ->add('id', 'valid', ['rule' => 'numeric']) 
     ->allowEmpty('id', 'create') 
     ->requirePresence('subdomain', 'create') 
     ->notEmpty('subdomain') 
     ->add('subdomain', 'validFormat', [ 
       'rule' => 'alphanumeric', 
       'message' => 'El subdominio solo puede contener números y letras sin tildes.', 
       ]) 
     ->add('subdomain', [ 
       'unique' => ['rule' => 'validateUnique', 'provider' => 'table'] 
       ]) 
     ->requirePresence('name', 'create') 
     ->notEmpty('name') 
     ->add('profile_count', 'valid', ['rule' => 'numeric']) 
     ->requirePresence('profile_count', 'create') 
     ->notEmpty('profile_count'); 
    } 
} 

Вызов:

use App\Model\Validation\SiteValidator; 

.... 
$validator = new SiteValidator(); 
$validator->errors($this->request->data) 

ответ

1

Вы определяете table провайдера как имя класса, так что это ожидаемое поведение, валидатор в этом случае вызовет validateUnique().

См Cookbook > Validation > Adding Validation Providers

Вы должны пройти фактический экземпляр класса таблицы для того, чтобы использовать методы проверки таблиц:

$sitesTable = TableRegistry::get('Sites'); 
$validator->provider('table', $sitesTable); 

или, что может быть лучшим выбором, определим валидатор на вашем классе таблицы и использовать опцию validate с newEntity()/newEntities()/patchEntity()/patchEntities().

$sitesTable->validator('site', $validator); 
$entity = $sitesTable->newEntity($this->request->data, [ 
    'validate' => 'site' 
]); 

Смотрите также

+0

работы ed charms, мне нравится первый вариант лучше, потому что мне нужно проверить правильность хранения данных в сеансе, а не сохранять его (пока). это нормально, если я передаю SiteTable в конструктор валидатора? – SkarXa

+0

@SkarXa Зависит от вашего определения «_OK_», но с технической точки зрения все будет в порядке. – ndm

+0

Знаете, стандарты торта, условности, чистота, независимость от кода ... – SkarXa

Смежные вопросы