首页  >  文章  >  web前端  >  表单验证对象和认证类的提取

表单验证对象和认证类的提取

WBOY
WBOY原创
2024-07-18 12:25:38894浏览

Extraction of Form Validation Object and Authenticate Class

在我们之前的项目中,我们学习了如何登录或注销注册用户。但是今天,我们将学习如何提取表单验证对象以及如何在项目中提取验证类。

在 VS Code 端

要启动项目,我们需要添加一个名为 Http 的新目录,然后将控制器移动到这个新目录中。接下来,我们需要在Http中添加另一个名为Forms的新目录,并在该目录中添加一个新文件LoginForm。然后,我们需要运行该项目,这会显示错误,因为控制器已移动到新目录,并且需要在routes.php中更新其路由。

$router->get('/', 'index.php');
$router->get('/about', 'about.php');
$router->get('/contact', 'contact.php');
$router->get('/notes', 'notes/index.php')->only('auth');
$router->get('/note', 'notes/show.php');
$router->delete('/note', 'notes/destroy.php');
$router->get('/note/edit', 'notes/edit.php');
$router->patch('/note', 'notes/update.php');
$router->get('/notes/create', 'notes/create.php');
$router->post('/notes', 'notes/store.php');
$router->get('/register', 'registration/create.php')->only('guest');
$router->post('/register', 'registration/store.php')->only('guest');
$router->get('/login', 'session/create.php')->only('guest');
$router->post('/session', 'session/store.php')->only('guest');
$router->delete('/session', 'session/destroy.php')->only('auth');

提取表单验证对象

要提取表单验证对象,我们需要转到 session/store.php 并删除检查所提供的电子邮件和密码是否正确的代码。然后,我们需要将此代码移至 LoginForm.php 文件,该文件位于 Http/Forms 目录中。

登录表单

LoginForm.php 文件将包含与用户登录相关的数据以验证表单以及指向项目中错误的受保护错误数组

<? php
namespace Http\Forms;
use Core\Validator;
class LoginForm {
  protected $errors = [];
  public function validate($email, $password) {
    if (!Validator::email($email)) {
      $this->errors['email'] = 'Please provide a valid email address.';
    }
    if (!Validator::string($password)) {
      $this->errors['password'] = 'Please provide a valid password.';
    }
    return empty($this->errors);
  }
  public function errors() {
    return $this->errors;
  }
  public function error($field, $message) {
    $this->errors[$field] = $message;
  }
}

现在我们可以看到该项目运行良好。

提取验证类

接下来,为了提取验证类,我们需要选择用于验证用户身份的所有代码段,例如检查用户的电子邮件和密码。然后我们需要添加一个新文件authenticator.php,它将包含一个用于用户身份验证的authenticate类,然后导入登录和注销功能。

<?ph
namespace Core;
class Authenticator {
  public function attempt($email, $password) {
    $user = App::resolve(Database::class)
      ->query('select * from users where email = :email', [ 'email' => $email ])
      ->find();
    if ($user) {
      if (password_verify($password, $user['password'])) {
        $this->login([ 'email' => $email ]);
        return true;
      }
    }
    return false;
  }
  public function login($user) {
    $_SESSION['user'] = [ 'email' => $user['email'] ];
    session_regenerate_id(true);
  }
  public function logout() {
    $_SESSION = [];
    session_destroy();
    $params = session_get_cookie_params();
    setcookie('PHPSESSID', '', time() - 3600, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
  }
}

更新会话存储文件

进一步,我们需要返回 session/store.php 并初始化 $form 并用于新用户登录。然后我们需要实现一个 if 条件来检查表单是否有效。如果表单无效,我们必须将用户重定向到所需的路径。

<?php
use Core\Authenticator;
use Http\Forms\LoginForm;

$email = $_POST['email'];
$password = $_POST['password'];

$form = new LoginForm();
if ($form->validate($email, $password)) {
  if ((new Authenticator)->attempt($email, $password)) {
    redirect('/');
  }
  $form->error('email', 'No matching account found for that email address and password.');
}
return view('session/create.view.php', [ 'errors' => $form

通过进行这些更改,我们可以提取一个身份验证类来更改代码的外观,这意味着易于理解和修改。

希望你已经清楚地理解了

以上是表单验证对象和认证类的提取的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn