ログイン処理の追加

目次
  • 解説
  • 1. ログイン処理の内容
  • 2. ルーティング設定
  • 3. データの受け取り
  • 4. 入力チェック
  • 5. 画面遷移
  • 6. リダイレクトとは
進捗を変更する




解説

1. ログイン処理の内容


次はログイン画面の「メールアドレス」「パスワード」欄に入力した値をもとに、ログインの成否を判定するログイン処理を実装します。

追加する処理は以下のとおりです。

(1)「/login」への「POST」通信のルーティング設定
(2)ユーザーが入力したメールアドレス、パスワードの受け取り処理
(3)正しいメールアドレス、パスワードであるかの検証処理
(4)検証結果による画面遷移の振り分け処理

2. ルーティング設定


ユーザーが入力したデータは、「/login」に対して「POST」通信で送られます。

<form class="login_form" action="login" method="POST">

前のページで実装したログイン画面を表示する処理も「/login」へのアクセスと紐づけられていました。なので、「GET」通信か「POST」通信かを判定することで処理を分岐させるよう処理を追加しましょう。

処理の分岐

手順1

(1)index.php」を以下のコードで置き換えてください。
<?php

require_once './application/controllers/LoginController.php';

$pathName = explode('/', $_SERVER['REQUEST_URI'])[2]; // 「login」や「home」などのパスを取得
$method = $_SERVER['REQUEST_METHOD']; // 通信方式を取得(GET or POST)

if ($pathName === 'login') {
    $loginController = new LoginController();

    if ($method === 'GET') {
        $loginController->getAction();
    } elseif ($method === 'POST') {
        $loginController->postAction();
    }
}

解説

処理の流れ

$method = $_SERVER['REQUEST_METHOD'];

URLを取得するのに使用した、「$_SERVER[]」に「 REQUEST_METHOD 」を指定することで、現在のアクセスの通信方式を取得することができます。(「GET」や「POST」などの文字列が取得できます。)

if ($method === 'GET') {
        $loginController->getAction();
    } elseif ($method === 'POST') {
        $loginController->postAction();
    }

「GET」通信の場合は「getAction」メソッドを呼び出し、「POST」通信の場合は「postAction」メソッドを呼び出しています。

3. データの受け取り


次は「LoginController.php」に「postAction」メソッドを作成し、その中でユーザーが入力したメールアドレス、パスワードを受け取る処理を実装しましょう。

手順2

(1)LoginController.php」のクラス内に、以下のコードを追記してください。
public function postAction()
{
    $email = filter_input(INPUT_POST, 'email');
    $password = filter_input(INPUT_POST, 'password');
}

4. 入力チェック


次は、ユーザーが入力したメールアドレス、パスワードのチェック機能を作成しましょう。

DBに存在するユーザーのみログインできる仕様ですが、まだつぶやきアプリにはDBと連携する仕組みがありません。そのため、まずはログインできるのは下記のユーザーのみとします。

メールアドレスパスワード
test@test.comtestpass

手順2で置き換えたコードで受け取ったデータを、チェックする処理を追加します。

手順3

(1)LoginController.php」のpostAction」メソッド内の最下部に、下記のコードを追記してください。
// ログインチェック用変数
$loginEmail = 'test@test.com';
$loginPassword = 'testpass';

チェック用のメールアドレス、パスワードを変数として定義しています。

(2)postAction」メソッド内の最下部に、下記のコードを追記してください。
if ($email === $loginEmail && $password === $loginPassword) {
    // ログイン成功時の処理
} else {
    // ログイン失敗時の処理
}

ブラウザから送られてきたデータと、チェック用の変数を比較する処理を追加しています。

これで、ユーザーが入力したメールアドレスが「test@test.com」かつ、パスワードが「testpass」の場合と、それ以外の場合で処理を分岐させることができました。

5. 画面遷移


次はログイン処理の成否によって、遷移先を分けていきましょう。

手順4

(1)LoginController.php」の「ログイン成功時の処理」のコメントの下に、下記のコードを追記してください。
header('Location:' . 'home');
exit();

ログイン成功時はトップ画面に遷移するように処理を追加しています。

(2)ログイン失敗時の処理」のコメントの下に、下記のコードを追記してください。
header('Location:' . 'login');
exit();

ログイン失敗時は再度ログイン画面に遷移するように処理を追加しています。

解説

header('Location:')

header関数の引数に、「Location:」+「パス」を記述することで、指定したURLへリダイレクトをおこないます。

この関数の後にも処理が記述されている場合、リダイレクト後も処理は継続してしまいますので、処理の実行を終了する「exit」関数を記述して、明示的に処理を終了させるようにしましょう。

では、実行して動きを確認しましょう。
メールアドレス入力フォームに「test@test.com」を、パスワード入力フォームに「testpass」を入力し、送信すると「http://localhost/tweet_php/home」に遷移し、それ以外を入力すると「http://localhost/tweet_php/login」にアクセスし、再度ログイン画面を表示します。これで、DBを使用しない簡易的なログイン処理を実装することができました。

ログイン成功時

6. リダイレクトとは


リダイレクトとは、ブラウザに再度リクエストを促す処理です。リダイレクトを行うことで、ブラウザが、自動で指定した宛先にリクエストを行います。そのため、内部的に二度リクエストが行われ、URLは二度目にリクエストした宛先になります。

今回は遷移先のURLに変更したいため、リダイレクトを使用しています。


ソース全文を表示
<?php

require_once './application/controllers/LoginController.php';

$pathName = explode('/', $_SERVER['REQUEST_URI'])[2]; // 「login」や「home」などのパスを取得
$method = $_SERVER['REQUEST_METHOD']; // 通信方式を取得(GET or POST)

if ($pathName === 'login') {
    $loginController = new LoginController();

    if ($method === 'GET') {
        $loginController->getAction();
    } elseif ($method === 'POST') {
        $loginController->postAction();
    }
}
<?php

class LoginController
{
    public function getAction()
    {
        require_once './application/views/login.php';
    }

    public function postAction()
    {
        $email = filter_input(INPUT_POST, 'email');
        $password = filter_input(INPUT_POST, 'password');

        // ログインチェック用変数
        $loginEmail = 'test@test.com';
        $loginPassword = 'testpass';

        if ($email === $loginEmail && $password === $loginPassword) {
            // ログイン成功時の処理
            header('Location:' . 'home');
            exit();
        } else {
            // ログイン失敗時の処理
            header('Location:' . 'login');
            exit();
        }
    }
}