CakePHP проверяет только часть модели - PullRequest
0 голосов
/ 16 апреля 2019

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

Мне нужно, чтобы они совпадали и оба присутствовали. book_name_confirm не сохраняется в БД.

$validator
    ->scalar('book_name')
    ->maxLength('book_name', 255)
    ->requirePresence('book_name')
    ->sameAs('book_name_confirm', 'book_name', 'Book names must match')
    ->allowEmptyString('book_name', false);

Что, кажется, работает нормально при первоначальном создании записи ... но затем при обновлении только этих двух полей проверка не применяется.

Пример:

Назовите книгу "Пушистые зайчики" и подтвердите и просмотрите запись, созданную в базе данных. Валидация происходит, как и ожидалось - при вводе чего-либо еще на входе подтверждения возвращается установленная ошибка.

Перейти на страницу обновления названия книги.

Введите несоответствующие названия книг и отправьте, сохраняя новое название книги. Ошибка не выдана. Может видеть новое значение отображается и в БД. Выдает ли браузер ошибку «не должно быть пустым», если вы пытаетесь оставить его пустым.

Сама форма:

<?= $this->Form->create($book) ?>
<fieldset>
    <?php
        echo $this->Form->control('book_name');
        echo $this->Form->control('book_name_confirm', array('label' => 'Confirm book name'));
        ?>
</fieldset>
<?= $this->Form->button(__('Set new book name')) ?>
<?= $this->Form->end() ?>

И контроллер:

if ($this->request->is(['patch', 'post', 'put'])){
    //bookTracking is passed through URL, is a UUID 
    $bookQuery = $this->Books->find('all')
        ->where(["tracking =" => $bookTracking]);
    $book = $bookQuery->first();
    //stuff here to handle missing books

    $book->book_name = $this->request->getData("book_name");
    $book->book_name_confirm = $this->request->getData("book_name_confirm");

    $this->Books->save($book);
    //redirect
} 

$book = $this->Books->newEntity();
$this->set(compact('book'));

Полагаю, я мог бы выполнить некоторую ручную проверку в контроллере, но это, казалось бы, противоречило цели настройки всей модели проверки. Чего мне не хватает?

1 Ответ

1 голос
/ 16 апреля 2019

Когда вы устанавливаете значения напрямую, проверка не выполняется; это предполагает, что вы знали, что делали, когда делали эти ценности. Вместо этого используйте функцию patchEntity:

$book = $this->Books->patchEntity($book, $this->request->getData());
...