PHPプログラミング診断室

第6回 永遠のPHP 4(治療編)

この記事を読むのに必要な時間:およそ 4.5 分

修正コード

PHP 4は,もうお疲れ様なので,PHP 5に移行してみましょう。

前回は,主にPHP 4流の書き方を指摘したので,これらをPHP 5らしい今の書き方に修正しています。またコードが理解しやすいように制御構造の見直しを行い,深いインデントにならないような工夫をしています。さらに今回は昨今のPHP界隈でよく使われているオートローダを使って,クラスファイルを自動で読み込むテクニックを組み込んでみました。

では,治療後の修正コードをどうぞ。

controller/LoginController.php

<?php
namespace Acme\Controller;

require_once dirname(__DIR__).'/vendor/autoload.php';

use Acme\Lib\BasicController;
use Acme\Lib\Http;
use Acme\Lib\CheckExecuter;
use Acme\Lib\Login;
use Acme\Model\UserModel;

/**
 * <b>LoginControler</b>
 * ログインコントローラ
 *
 * @author hoge
 */
class LoginController extends BasicController
{
    const LOGIN_ID = 'login_id';
    const PASSWORD = 'password';
    const PASSWORD_MAX_LENGTH = 8;

    /**
     * @var string
     */
    protected $NEXT_PAGE = 'top.php';

    /**
     * コンストラクタ
     */
    public function __construct()
    {
        $this->init();

        // セッションクリア
        unset($_SESSION[UserModel::SESSION_USER]);

        if (Http::isPost()) {
            $this->values = $_POST;
        } else {
            $this->values = null;
        }
    }

    /**
     * メイン処理
     */
    public function execute()
    {
        if (!Http::isPost()) {
            return;
        }

        // 値チェック
        $checker = new CheckExecuter($this);
        $checker->check();
        $this->errorMessages = $checker->getErrorMessages();
        if ($this->isError()) {
            return;
        }

        // セッションクリア
        $_SESSION = array();

        // ログイン処理
        $userModel = Login::auth($this->values[static::LOGIN_ID], $this->values[static::PASSWORD]);
        if (empty($userModel)) {
            $this->addErrorMessage('error_not_login');
            return;
        }

        // セッションIDの振り直し
        session_regenerate_id(true);

        unset($_SESSION[UserModel::SESSION_USER]);
        $_SESSION[UserModel::SESSION_USER] = $userModel;

        // 次ページへ
        $this->transferPage($this->NEXT_PAGE);
    }

    /**
     * ログインIDチェック
     *
     * @return mixed 正常ならnull / エラーならコード?
     */
    public function checkLoginId()
    {
        if (isset($this->values[static::LOGIN_ID])
            && $this->values[static::LOGIN_ID]) {
            return null;
        } else {
            return 'check_login_id';
        }
    }

    /**
     * パスワードチェック
     * 半角英数8桁以内
     *
     * @return mixed 正常ならnull / エラーならコード?
     */
    public function checkPassword()
    {
        if (isset($this->values[static::PASSWORD])
            && $this->values[static::PASSWORD]
            && preg_match('/^[a-zA-Z0-9]+$/', $this->values[static::PASSWORD])
            && strlen($this->values[static::PASSWORD]) <= static::PASSWORD_MAX_LENGTH) {
            return null;
        } else {
            return 'check_password';
        }
    }
}

lib/Login.php

<?php
namespace Acme\Lib;

use Acme\Lib\Database;
use Acme\Model\UserModel;

/**
 * <b>Login</b>
 * ログインクラス
 * ログイン管理を行う
 *
 * @author hoge
 */
class Login
{
    /**
     * 認証
     *
     * @param string $loginId
     * @param string $password
     * @return UserModel
     */
    public static function auth($loginId, $password)
    {
        // PostgreSQL には事前に接続済とする
        $loginId = pg_escape_literal($loginId);
        $password = pg_escape_literal($password);
        $where = sprintf('login_id=%s and password=%s', $loginId, $password);

        $db = Database::getInstance();
        $record = $db->getOneRecord('*', 'v_user', $where);
        if (empty($record)) {
            return null;
        }

        $userModel = new UserModel();
        $userModel->setAttributes($record);

        return $userModel;
    }
}

著者プロフィール

新原雅司(しんばらまさし)

1×1株式会社 代表取締役

大阪でPHPを駆使してWebシステムの開発を行う日々。MotoGPをこよなく愛す。愛車はPCX。

Twitter:shin1x1
blog:Shin x blog

コメント

コメントの記入