Регистрация и авторизация пользователей на PHP. Часть вторая
Переходим к непосредственной работе с пользователями сайта. Первым делом определим, авторизован ли пользователь. Здесь нам придется немного забежать вперед. В файле bootstrap.php будем сразу же получать информацию об авторизованном пользователе.
<?php // Файл bootstrap.php // Инициализируем константу для защиты от стороннего доступа define("LEZH", TRUE); // Определяем каталог исходных файлов нашего сайта define("SITE_DIR", __DIR__); // Определяем путь к каталогу файла с определением ядра сайта define("CORE_DIR", SITE_DIR . DIRECTORY_SEPARATOR . "modules" . DIRECTORY_SEPARATOR . "core" . DIRECTORY_SEPARATOR); // Подключаем файл с определением класса ядра нашего сайта require_once(CORE_DIR . "core.php"); // Инициализируем ядро сайта Core::init(); // Получаем информацию об авторизации пользователя Core::factory("User")->getAuthUser(); ?>
Читателю очевидно, что нам нужно определить класс User, который будет иметь метод getCurrent(), возвращающий информацию об авторизованном пользователе. Кроме этого, конечно же, следует в классе Core создать фабричный метод. Начнем именно с него. Заодно немного преобразуем код этого класса.
<?php // Файл modules/core/core.php defined("LEZH") || exit("Доступ к файлу запрещен"); /** * Класс ядра сайта будет статическим */ class Core { // Конфигурации чего-либо на нашем сайте static protected $_config = array(); /** * Инициализирует ядро сайта * ничего не возвращает */ static public function init() { // Получаем конфигурацию подключения к СУБД // Данные для подключения хранятся внутри каталога core в каталоге config static::$_config["database"] = include("config/database.php"); // Регистрируем функции Core::_registerFunctions(); // Подключаемся к СУБД Core_Database::instance() ->setConfig(static::$_config["database"]) ->connect(); } /** * Регистрируем пользовательские функции * @param string $class путь к файлу с определением класса */ static protected function _registerFunctions() { // Реализация метода _autoload spl_autoload_register(array("Core", "_autoload")); } /** * Подключает пользовательские классы */ static public function _autoload($class) { // Получаем путь к файлу с определением класса $path = CORE_DIR . static::getClassPath($class); // Подключаем файл с определением класса require_once($path); } /** * Получает путь к файлу с определением класса */ static public function getClassPath($class) { // Разбираем путь к файлу $aPathToClass = explode("_", $class); // Если имя начиналось с Core, убираем его из массива if (strtolower($aPathToClass[0]) == "core") { array_shift($aPathToClass); } // Последним элементом массива должно быть имя файла $sFileName = strtolower(array_pop($aPathToClass)); // Если нет имени файла, ничего не делаем if (empty($sFileName)) { return; } // Если такой файл существует if (is_file(CORE_DIR . $sFileName . ".php")) { $path = strtolower(implode(DIRECTORY_SEPARATOR, $aPathToClass)) . $sFileName . ".php"; } // Если такого файла нет, проверяем, существует ли файл описания модели elseif (is_file(CORE_DIR . $sFileName . DIRECTORY_SEPARATOR . "model.php")) { $path = strtolower($sFileName . DIRECTORY_SEPARATOR . "model.php"); } else { throw new Exception("Не существует файла с определением класса <strong>" . $class . "</strong>"); } // Возвращаем путь к файлу return $path; } /** * Создает экземпляр указанного класса */ static public function factory($class) { // Получаем путь к файлу $path = static::getClassPath($class); // Проверяем, существует ли класс с указанным именем // попробуем дополнить имя класса if (!class_exists($class)) { $class = $class . "_Model"; } return new $class(); } } ?>
Теперь нам нужно определить класс модели User_Model.
<?php // Файл modules/core/user/model.php defined("LEZH") || exit("Доступ к файлу запрещен"); class User_Model extends Core_ORM { /** * Конструктор класса */ public function __construct() { } /** * Устанавливает авторизованного пользователя */ public function authUser() { } /** * Получает авторизованного пользователя */ public function getAuthUser() { } } ?>
Очевидно, что класс User_Model наследует свойства и методы класса Core_ORM. Определяем предварительно и его.
<?php // Файл modules/core/orm.php defined("LEZH") || exit("Доступ к файлу запрещен"); class Core_ORM { public function __construct() { } } ?>
Теперь нужно объяснить, что происходит при создании экземпляра объекта класса User_Model. Мы в этом случае получаем из базы данных информацию о всех существующих пользователях.
Самое время поговорить о том, какие именно данные у нас будут храниться в MySQL о зарегистрированных пользователях. Во-первых, это будет логин, во-вторых, пароль, в-третьих, адрес электронной почты, затем дата регистрации. Храниться это будет в таблице базы данных Users. Именно Users — множественное число. В качестве логина пользователя будет использоваться адрес электропочты. Давайте создадим такую таблицу.
-- -- Структура таблицы `users` -- DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` int(10) UNSIGNED NOT NULL, `login` varchar(128) NOT NULL, `password` varchar(128) NOT NULL, `registration_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `deleted` tinyint(1) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Индексы сохранённых таблиц -- -- -- Индексы таблицы `users` -- ALTER TABLE `users` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT для сохранённых таблиц -- -- -- AUTO_INCREMENT для таблицы `users` -- ALTER TABLE `users` MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; COMMIT;
Вся работа с пользователями сайта будет осуществляться через класс User_Model. Выглядеть это будет так.
<?php // Логин пользователя, переданный, например, методом $_POST $sLogin = htmlspecialchars(trim(strval($_POST["login"]))); $sPassword = htmlspecialchars(trim(strval($_POST["password"]))); // Создаем экземпляр класса модели пользователя $oUser = Core::factory("User"); // Находим пользователя по указанному логину $oUser->getByLogin($sLogin) // Подтверждаем соответствие переданного пароля указанному логину ->verifyPassword($sPassword); // Если такой пользователь есть if (!is_null($oUser)) { // Авторизуем пользователя $oUser->authUser(); } // Метод getAuthUser() вернет информацию об авторизованном пользователе $oUser->getAuthUser(); // Метод deauthUser() отменяет авторизацию пользователя $oUser->deauthUser(); // Следующим образом мы будем регистрировать новых пользователей $oUser = Core::factory("User"); // Регистрируем пользователя, если он не зарегистрирован if (!$oUser->ifExists($sLogin)) { $oUser->login($sLogin) ->password($sPassword) ->registration(); } // Получать информацию о конкретном пользователе, например, авторизованном, тоже будет легко $oUser = Core::factory("User"); // Можем вывести логин пользователя на экран print $oUser->login; // Можем показать дату регистрации пользователя print (new DateTime($oUser->registration_date))->format("d.m.Y"); ?>
Теперь, чтобы это всё работало, нам осталось немного поработать над классами Core_ORM, User_Model и Core_Database. Об этом пойдет речь в другой части статьи.