Регистрация

Бэкенд

Сначала в базе данных надо создать таблицу с пользователями:

CREATE TABLE users (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    password VARCHAR(255),
    role VARCHAR(20),
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

Затем надо создать файлы для таблицы users. Сделать это можно через консольную команду:

bin/cake bake all users

В результате станет доступна страница «/users», в которой будет выводиться пользователи. Также можно добавлять и изменять пользователей.

Надо указать, что при добавлении или обновления пользователя надо шифровать его пароль. Сделать это можно в файле src/Model/Entity/User.php.

# src/Model/Entity/User.php

namespace App\Model\Entity;

use Cake\Auth\DefaultPasswordHasher;
use Cake\ORM\Entity;

class User extends Entity
{

    // шифровать пароль при добавлении или обновлении пользователя
    protected function _setPassword($password)
    {
        if (strlen($password) > 0) {
            return (new DefaultPasswordHasher)->hash($password);
        }
    }

}

Фронтенд

Вывести форму регистрации можно через следующий код:

<?= $this->Form->create() ?>
    <?= $this->Form->control('username') ?>
    <?= $this->Form->control('password') ?>
    <?= $this->Form->button('Зарегистрироваться'); ?>
<?= $this->Form->end() ?>

Выводить форму регистрации надо через код выше (т.е. не вручную через HTML), иначе при добавлении пользователя будет выводиться ошибка «CSRF token mismatch».

Добавить пользователя можно через код ниже:

$user = $this->Users->newEmptyEntity();
if ($this->request->is('post')) {
    $user = $this->Users->patchEntity($user, $this->request->getData());
    if ($this->Users->save($user)) {
        $this->Flash->success('Вы успешно зарегистрировались');

        return $this->redirect(['action' => 'index']);
    }
    $this->Flash->error('Не удалось зарегистрироваться. Пожалуйста, попробуйте позже');
}

$this->set('user', $user);

Валидация

Можно добавить проверку на валидность данных (например, поля заполнены). Сделать это можно в файле src/Model/Table/UsersTable.php.

# src/Model/Table/UsersTable.php

public function validationDefault(Validator $validator): Validator
{
    // поля обязательны для заполнения
    $validator->notEmpty('username', 'Не заполнено поле username');
    $validator->notEmpty('password', 'Не заполнено поле password');

    return $validator;
}

public function buildRules(RulesChecker $rules): RulesChecker
{
    // значение поля username должно быть уникальным
    $rules->add($rules->isUnique(['username']));
    return $rules;
}

Код выше делает поля «username» и «password» обязательными для заполнения. А также проверяет, что значение поля «username» нет в базе данных.