Edited at

PHPでログイン機能を実装するチュートリアル #2

More than 3 years have passed since last update.

前回の続き。


  1. 基本設計、ユーザーモデル

  2. オートローダー

  3. 例外・ログ


  4. PDO シングルトン SQLインジェクション



  5. ユーザーモデルの作成


  6. クラスの継承


  7. テンプレート・クラスの実装


  8. アカウントロック機能の実装


  9. メール送信機能の実装


  10. アカウントロック解除機能の実装


  11. CSRF対策



オートローディング機能の実装

とりあえず、不十分ではありますが、UserModel の実体ができましたので、オートローディングの機能を作成します。オートローディング機能を使うと、new ClassName() をするなど、クラスをインスタンス化したり、静的メソッドを実行する際に、毎回 requirerequire_once を記述しなくても済むようになります。

PHP5.3 以上で実装された名前空間を上手に利用してこの機能を実装してみましょう。

前回、UserModel は以下のように作成しました。


UserModel.class.php

<?php

final class UserModel
{

中略


名前空間を利用して、以下のように変更します。


UserModel.class.php

<?php

namespace MyApp\model

final class UserModel
{

中略


classes/model/UserModel.class.php に配置しているファイルを自動的に require する機能を実装すれば良いわけです。

動作を検証しながら作成を進めます。

ブラウザで実行結果を確認しながら進めるので、webroot/index.php を作成します。


webroot/index.php

<?php

$objUserModel = new MyApp\model\UserModel;


このように記述すると、通常、「そんなクラスねえ!」って怒られるわけですが、autoload を作っておくとよしなにやってくれるわけですね。

リファレンスにも書かれているように、


spl_autoload_register() を使えば、より柔軟にクラスのオートロードができます。 そのため、今や __autoload() を使うことはおすすめできません。 将来のバージョンではこの機能が非推奨となり、削除されるかもしれません。


なので、素直に、spl_autoload_register 関数 を利用します。

ついでに、どのファイルからも共通で読み込みして利用する common.php, 各種設定値を定義する config.php を作成しておきましょう。

以後、webroot 以下に作成するファイルには require_once '../common.php'; を共通して記述することになります。


webroot/index.php

<?php

require_once '../common.php';

$objUserModel = new MyApp\model\UserModel;
var_dump($objUserModel); //@todo 後で消す


common.php から config.php を読み込んでおけば、忘れることもありません。


common.php

<?php

require_once 'config.php';

//本番の時には PRODUCTION に書き換える
define('MODE', DEVELOPPING);

// 開発モードのときにエラーを表示する
if (MODE === DEVELOPPING) {
ini_set('display_errors', true);
error_reporting(E_ALL);
} else {
ini_set('display_errors', false);
}

require_once BASE_DIR . '/autoload.php';
spl_autoload_register('autoloader');



config.php

<?php

/**
* 開発モード
*/

define('DEVELOPPING', 1);

/**
* 本番モード
*/

define('PRODUCTION', 2);

define('BASE_DIR', __DIR__);



autoload.php

<?php

function autoloader($name)
{
$arrToken = explode('\\', $name);
$arrToken[0] = '/classes';
$filename = BASE_DIR . implode("/", $arrToken) . '.class.php';
if (file_exists($filename)) {
require_once($filename);
}
}

ここまでできれば、ブラウザから index.php にアクセスすると、


index.php

object(MyApp\model\UserModel)[1]

private '_userId' => null
private '_password' => null
private '_displayName' => null
private '_email' => null
private '_token' => null
private '_loginFailureCount' => null
private '_loginFailureDatetime' => null
private '_deleteFlag' => null

上記のようにブラウザに表示されるはずです。

続きはまた後日…