Регистрация и авторизация пользователей на 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. Об этом пойдет речь в другой части статьи.


Сайт принадлежит ООО Группа Ралтэк. 2014 — 2021 гг