Регистрация
Бэкенд
Сначала в базе данных надо создать таблицу с пользователями:
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» нет в базе данных.
Поддержать автора