Регистрация на сайте на PHP

Пишем регистрацию на сайте на PHP

Ну вот мы с вами и закончили изучение основных возможностей объектно-ориентированного программирования. Теперь мы будем учиться применять все эти возможности в деле. А именно – напишем движок для блога на чистом PHP. И в сегодняшнем уроке мы напишем систему регистрации на сайте. Благодаря ей новые пользователи смогут регистрироваться на нашем сайте. Поехали.

В одном из прошлых уроков мы с вами уже создавали таблицу users, которая имеет следующий вид:

Именно её мы и будем использовать для хранения информации о новых пользователях. Давайте первым делом составим список полей, которые мы должны будем принимать от пользователя для регистрации:

  • nickname – должен быть уникальным и содержать только символы латинского алфавита и цифры;
  • email – должен быть уникальным и быть корректным email-ом;
  • password – должен быть не менее 8 символов (будет захеширован и будет храниться в поле password_hash).

Все остальные поля будут заполняться значениями по-умолчанию на стороне сервера.

Создаём контроллер

Итак, давайте создадим контроллер для работы с пользователями.

src/MyProject/Controllers/UsersController.php

Код доступен только после покупки курса ООП в PHP7.

Добавляем роут

Теперь давайте пропишем роутинг для данной странички. Пусть это будет myproject.loc/users/register

src/routes.php

Код доступен только после покупки курса ООП в PHP7.

Проверим, что всё работает:

Создаём шаблон

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

templates/users/signUp.php

Код доступен только после покупки курса ООП в PHP7.

И теперь отрендерим этот шаблон в нашем контроллере:

src/MyProject/Controllers/UsersController.php

Код доступен только после покупки курса ООП в PHP7.

Проверяем, что все работает

Пишем логику регистрации

Итак, заготовочку сделали, теперь – самое интересное. Нам нужно обработать данные, пришедшие от пользователя. Принимать данные из запроса мы будем внутри контроллера, однако вся логика по проверке этих данных будет находиться внутри модели пользователя. То есть принять данные из запроса – это всегда ответственность контроллера. Далее его задача – передать эти данные модели, чтобы она произвела с ними какие-то действия(проверила на валидность, сохранила в базу). Контроллеры не должны содержать в себе бизнес-логику (то есть то, как должны обрабатываться и храниться данные). За счет того, что такая логика всегда содержится в моделях, код становится проще реиспользовать (использовать в нескольких местах). Например, мы можем из разных контроллеров обращаться к одному и тому же коду, который хранится в модели. Итак, давайте создадим в модели пользователя статический метод, который будет принимать на вход массив с данными, пришедшими от пользователя, и будет пытаться создать нового пользователя и сохранить его в базе данных.

src/MyProject/Models/Users/User.php

Код доступен только после покупки курса ООП в PHP7.

Именно этот код мы и будем вызывать в контроллере, если пришел POST-запрос.

src/MyProject/Controllers/UsersController.php

Код доступен только после покупки курса ООП в PHP7.

Проверка входных данных на пустоту

Итак, приступаем к написанию логики в модели. Для начала стоит убедиться в том, что все необходимые данные были переданы в запросе. Если это не так – будем кидать исключение. Для такого рода ошибок заведем отдельное исключение:

src/MyProject/Exceptions/InvalidArgumentException.php

Код доступен только после покупки курса ООП в PHP7.

Мы будем использовать его для случаев, когда были переданы некорректные параметры или данные.

Итак, пишем проверки на то, что все данные были переданы:

src/MyProject/Models/Users/User.php

Код доступен только после покупки курса ООП в PHP7.

В контроллере теперь нужно научиться обрабатывать эти исключения:

src/MyProject/Controllers/UsersController.php

Код доступен только после покупки курса ООП в PHP7.

Видите, мы начали передавать в шаблон переменную error? Нужно бы уметь выводить её в шаблоне, если она не пустая:

templates/users/signUp.php

Код доступен только после покупки курса ООП в PHP7.

Теперь попробуем отправить форму регистрации с пустыми полями:

Увидим, что код упал на первой же проверке.

Попробуем заполнить теперь поле nickname и снова отправим запрос.

Как видим, теперь уже ошибка о том, что мы не заполнили email. Отлично, значит наш код действительно проверяет наличие полей. Однако данные, которые мы заполняли перед отправкой формы потеряны, что, согласитесь неудобно, так как придется возвращаться назад. Давайте будем выводить в шаблоне данные, которые были переданы в запросе. Для этого используется атрибут value у тегов input.

Код доступен только после покупки курса ООП в PHP7.

Попробуем снова отправить форму с заполненным полем nickname.

Видим всё ту же ошибку, но теперь данные формы не потерялись. А это значит, что наш интерфейс стал гораздо более удобным для пользователя – если возникнет ошибка, ему не нужно будет вводить всё заново.

Проверка данных на валидность

Добавим также проверку на то, что длина пароля не менее восьми символов, а также что nickname содержит только допустимые символы, а email является корректным email-ом:

src/MyProject/Models/Users/User.php

Код доступен только после покупки курса ООП в PHP7.

Поиск дубликатов

Теперь стоит проверить, что пользователя с такими email и nickname нет в базе. Для этого нам понадобится метод, позволяющий находить записи в базе по какому-то одному столбцу. Давайте добавим его в класс ActiveRecordEntity.

src/MyProject/Models/ActiveRecordEntity.php

Код доступен только после покупки курса ООП в PHP7.

Этот метод будет принимает два параметра:

  1. имя столбца, по которому искать;
  2. значение, которое мы ищем в этом столбце.

Если ничего не найдено – вернётся null. Если же что-то нашлось – вернётся первая запись.
С помощью этого метода мы сможем искать пользователей по email и nickname:

src/MyProject/Models/Users/User.php

Код доступен только после покупки курса ООП в PHP7.

Ну, если все эти проверки пройдены - всё готово для того, чтобы создать нового пользователя.

Код доступен только после покупки курса ООП в PHP7.

Тут думаю всё понятно, кроме параметра authToken – это специально случайным образом сгенерированный параметр, с помощью которого пользователь будет авторизовываться. Мы не будем передавать после того как вошли на сайт в cookie ни пароль, ни его хеш. Мы будем использовать только этот токен, который у каждого пользователя будет свой и он никак не будет связан с паролем – так безопаснее.

В конце метода мы сохраняем этого нового пользователя в базу и возвращаем его из метода. Обратите внимание, что у метода появился тип возвращаемого значения: User – не забывайте их указывать.
Теперь в контроллере нужно получать результат этого метода и проверять, что нам вернулся только что созданный пользователь. Если всё ок – писать об этом на форме регистрации.

src/MyProject/Controllers/UsersController.php

Код доступен только после покупки курса ООП в PHP7.

Я решил не загромождать наш шаблон всем подряд и создал для успешной регистрации отдельный шаблончик - signUpSuccessful.php. Как видите, именно его я и рендерю в контроллере при успешном исходе.

templates/users/signUpSuccessful.php

Код доступен только после покупки курса ООП в PHP7.

Пробуем теперь заполнить нашу формочку корректными данными и отправляем запрос.

Заглянем теперь в базу и убедимся, что действительно появился новый пользователь

Вот мы и сделали регистрацию для нашего блога. В следующем уроке мы сделаем активацию пользователя по email-у.

Читайте также
Комментарии