Я пытаюсь создать систему аутентификации в php с помощью среды Slim3 вместе с системой шаблонов Twig, а для базы данных я использую MySQL с PDO. Я также пытаюсь реализовать это, используя шаблон проектирования контроллера представления модели. Однако мне трудно понять, как использовать структуру MVC для веб-приложения. Я посмотрел на множество объяснений в Интернете, и, похоже, нет однозначного ответа. Многие люди говорят об использовании php-фреймворка, такого как Laravel, Symfony или CodeIgniter, поскольку они, очевидно, используют MVC-подобную структуру. Однако я бы предпочел не усложнять ситуацию и писать код вручную, а не использовать фреймворк.
В настоящее время я вижу две интерпретации MVC. Первый изображен на этой диаграмме:
Другая интерпретация, которую я видел, такова: (взято из этого видео на YouTube )
Я провел свое исследование. Были полезны такие вопросы и ответы, как this и this . Но я все еще не уверен, как я мог бы структурировать свои собственные приложения, особенно идентифицируя и понимая аспект модели MVC. Теперь я объясню процесс регистрации моего приложения для аутентификации. Итак, у вас есть идея, как работает мой код.
Во-первых, у меня есть класс SQLQueries, который просто помещает ряд операторов SQL в функции. Затем у меня есть класс SQLWrapper, в котором есть функции, которые могут, например, хранить информацию о новых пользователях в базе данных. Этот класс также вызывает функции из класса SQLQueries. У меня также есть класс ValidateSanitize, который имеет функции, которые очищают пользовательский ввод, а также проверяют, является ли пользовательский ввод действительным в форме. Эти три класса, я думаю, являются частью модельного аспекта MVC, но я не уверен. Я вижу много других учебных пособий, использующих «класс модели пользователя», но я не могу найти его в своем приложении.
Мои представления - это просто шаблоны Twig, отображающие html, такие как домашняя страница, регистрация, вход в систему и т. Д. У меня есть контроллеры. Я намерен иметь несколько контроллеров, которые делают разные вещи. Пока я только внедрил AuthController, который отвечает за регистрацию и вход пользователя в систему.
Итак, первое, что делает AuthController, это отображает форму регистра в функции getRegisterForm. После того как пользователь отправил форму, функция postRegisterForm принимает этот пользовательский ввод и назначает его испорченным переменным.
public function postRegisterForm($request, $response)
{
$arr_tainted_params = $request->getParsedBody();
$tainted_email = $arr_tainted_params['email']; it a variable
$tainted_username = $arr_tainted_params['username'];
$tainted_password = $arr_tainted_params['password'];
$tainted_password_confirm = $arr_tainted_params['password_confirm'];
Затем создаются все три предыдущих класса, а также детали базы данных, поэтому их функции могут использоваться в AuthController:
$sanitizer_validator = $this->container->ValidateSanitize;
$sql_wrapper = $this->container->SQLWrapper;
$sql_queries = $this->container->SQLQueries;
$db_handle = $this->container->get('dbase');
Затем испорченные пользовательские данные очищаются с помощью функции sanitize_input. Затем очищенные данные пользователя передаются в функции проверки, чтобы убедиться, что они не вызывают нарушений проверки. Здесь также хешируется пароль:
$cleaned_email = $sanitizer_validator->sanitize_input($tainted_email, FILTER_SANITIZE_EMAIL);
$cleaned_username = $sanitizer_validator->sanitize_input($tainted_username, FILTER_SANITIZE_STRING);
$cleaned_password = $sanitizer_validator->sanitize_input($tainted_password, FILTER_SANITIZE_STRING);
$cleaned_password_confirm = $sanitizer_validator->sanitize_input($tainted_password_confirm, FILTER_SANITIZE_STRING);
$hashed_cleaned_password = password_hash($cleaned_password, PASSWORD_DEFAULT);
$sanitizer_validator->check_email_exists($cleaned_email);
$sanitizer_validator->validate_email($cleaned_email);
$sanitizer_validator->validate_username($cleaned_username);
$sanitizer_validator->validate_password($cleaned_password);
$sanitizer_validator→validate_password_confirm($cleaned_password_confirm);
Наконец, есть оператор if, который проверяет, все ли сообщения об ошибках валидации пусты. Если это так, мы предоставляем классу SQLWrapper данные базы данных, а также объект класса SQLQueries. Затем мы вставляем сведения о пользователях в базу данных, вызывая функцию store-details для классов SQLWrapper. Наконец, мы направляем пользователя на страницу входа, чтобы пользователь мог войти в свою недавно зарегистрированную учетную запись.
if ($sanitizer_validator->get_validate_messages('email_error') == ' ' && $sanitizer_validator->get_validate_messages('username_error') == ' '
&& $sanitizer_validator->get_validate_messages('password_error') == ' ' && $sanitizer_validator->check_passwords_match($cleaned_password, $cleaned_password_confirm ) == true
&& $sanitizer_validator->check_email_exists($cleaned_email) == false)
{
$sql_wrapper->set_db_handle($db_handle);
$sql_wrapper->set_sql_queries($sql_queries);
$sql_wrapper->store_details($cleaned_email, $cleaned_username, $hashed_cleaned_password);
return $response→withRedirect($this→container→router→pathFor('login'));
}
Однако, если какое-либо из сообщений об ошибке проверки не является пустым, мы вызываем SanitiseValidate display_validate_messages, который просто устанавливает сообщения в сеанс, который будет отображаться в шаблоне ветки регистра. Затем мы перенаправляем обратно на страницу регистрации, чтобы пользователь мог видеть сообщения об ошибках проверки.
else
{
$sanitizer_validator->display_validate_messages();
return $response->withRedirect($this->container->router->pathFor('register'));
}
}
Итак, основываясь на этомПользователь регистрирует учетную запись. Придерживается ли это чистой простой структуры MVC или необходимо внести некоторые изменения? Кто-нибудь из моих классов играет роль модели? Будем благодарны за любые предложения и советы относительно моей структуры.
Полное приложение можно увидеть на моем GitHub , если это будет полезно. Обратите внимание, что эта версия немного старше, чем образец кода, который я использовал в этом вопросе.