前のプロジェクトでは、登録済みユーザーにログインまたはログアウトする方法を学習しました。ただし、今日は、フォーム検証オブジェクトを抽出する方法と、プロジェクトでのクラス抽出の認証について学びます。
プロジェクトを開始するには、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 に移動し、指定された電子メールとパスワードが正しいかどうかをチェックするコードをカットする必要があります。次に、このコードを Http/Forms ディレクトリにある LoginForm.php ファイルに移動する必要があります。
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を追加する必要があります。このファイルには、ユーザー認証に使用される認証クラスが含まれ、ログインおよびログアウト関数がインポートされます。
<?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 中国語 Web サイトの他の関連記事を参照してください。