Пользовательская проверка CakePHP3.x не работает

Внутри класса UsersTable я пытаюсь реализовать пользовательскую проверку в соответствии с CakeBook, но получаю сообщение об ошибке Object of class App\Model\Table\UsersTable could not be converted to string [CORE/src/Validation/ValidationRule.php, line 128]. Ниже мой код в UsersTable.php.

class UsersTable extends Table{
    public function validationDefault(Validator $validator){
        $validator->add(
            "password",[
                 "notEmpty"=>[
                     "notEmpty"
                 ],
                 "custom"=>[
                     "rule"=>[$this,"customFunction"],
                     "message"=>"foo"
                 ]
             ]
        );
    }
    public function customFunction($value,$context){
        //some logic here
    }
}

Глядя на ValidationRule.php в основной библиотеке CakePHP, я заметил, что array_shift() (в строке 185) берет первый элемент [$this,"customFunction"], то есть $this, и присваивает его $value. Но на самом деле $value должно быть [$this,"customFunction"]. Поэтому, чтобы мой код работал без ошибок, мне нужно было добавить еще одно вложение в [$this,"customFunction"] (так что теперь [[$this,"customFunction"]]). Я что-то не понимаю или это какой-то баг?

UPD: Эта проблема исправлена.


person hitochan    schedule 21.08.2014    source источник


Ответы (2)


Я думаю, вы правильно это заметили, проблема, похоже, в том, что CakePHP ожидает, что значение ключа rule будет в

[string or callable, ...args]

формат, когда он находится в массиве, т. е. он не проверяет, является ли уже само значение вызываемым.

В документации сказано, что невложенный вариант должен работать, поэтому вы можете сообщить об этом как об ошибке.

person ndm    schedule 21.08.2014
comment
Как я могу сообщить об этом как об ошибке? на гитхабе? Большое спасибо, что много раз отвечали на мой вопрос :) - person hitochan; 21.08.2014
comment
Ok. Я сделаю это. Спасибо. - person hitochan; 21.08.2014

Используйте это в своей модели для пользовательской проверки

public function validationCustom($validator)
{
    return $validator
        ->notEmpty('username', 'A username is required');
}

Используйте имя метода проверки, кроме ключевого слова проверки в вашем контроллере, когда вы хотите сохранить или обновить

$user = $this->Articles->newEntity($this->request->data,
        ['validate' => 'custom']);
person Imtiaz Pabel    schedule 11.01.2015