FuelPHPでログインModuleを作る(2)‐実際のコード

こんにちは。hanikunです。

前回の「FuelPHPでログインModuleを作る(1)‐事前準備」に続き、今回はその実際のコードを紹介します。

0.Loginモジュールの画面

まずは、実際に作った画面を見てみましょう。CSSは書いてないので画面がシンプルになっています。

login/index.phpの画面です(ログイン画面です)。

fuelphp_login

login/create.phpの画面です(新規ユーザー作成です)。

fuelphp_create

mobile/index.phpの画面です(あぐりログの画面です)。

fuelphp_mobile

1.FuelPHPのログインModuleを作ろう

これからは実際にModuleを作ります。(モジュール説明

モジュールのフォルダ構造はアプリケーションフォルダのそれと同じなのです。下記のフォルダ構造がモジュールでサポートされています。

  • classes
    • controller
    • model
    • view
  • config
  • lang
  • tasks
  • views

今回はLoginモジュールを作るので「fuel\app\modules\」の下に「login」フォルダを作ります。

まずはControllerの部分の追加になります。

1.「classes\controller」の下にindex.phpを作ります。

fuel/app/modules/login/classes/controller/index.php

<?php

namespace Login;

class Controller_Index extends \Controller_Template
{
    public function before()
    {
        parent::before();
        $method = \Uri::segment(2);
        // ログイン済みチェック
        $nologin_methods = array(
            '',
            'index',
        );
        if (in_array($method, $nologin_methods) && \Auth::check()) {
            \Response::redirect('mobile/');
        }
        // CSRFチェック
        if (\Input::method() === 'POST') {
            if (!\Security::check_token()) {
                \Response::redirect('login/error');
            }
        }
    }

    private function validate_login()
    {
        // 入力チェック
        $validation = \Validation::forge();
        $validation->add('username', 'ユーザー名')
                ->add_rule('required')
                ->add_rule('min_length', 4)
                ->add_rule('max_length', 15);
        $validation->add('password', 'パスワード')
                ->add_rule('required')
                ->add_rule('min_length', 6)
                ->add_rule('max_length', 20);
        $validation->run();
        return $validation;
    }

    public function action_index()
    {
        // ログイン処理
        $username = \Input::post('username', null);
        $password = \Input::post('password', null);
        $result_validate = '';
        if ($username !== null && $password !== null) {
            $validation = $this->validate_login();
            $errors = $validation->error();
            if (empty($errors)) {
                // ログイン認証を行う
                $auth = \Auth::instance();
                if ($auth->login($username, $password)) {
                    // ログイン成功
                   \Response::redirect('mobile/');
                }
                $result_validate = "ログインに失敗しました。";
            } else {
                $result_validate = $validation->show_errors();
            }
        }
        $this->template->title = 'ログイン';
        $this->template->content = \View::forge('login/index');
        $this->template->content->set_safe('errmsg', $result_validate);
    }
}

2.「classes\controller」の下にcreate.phpを作ります。

fuel/app/modules/login/classes/controller/create.php

<?php

namespace Login;

class Controller_Create extends \Controller_Template
{
    public function before()
    {
        parent::before();
        $method = \Uri::segment(2);
        // ログイン済みチェック
        $nologin_methods = array(
            'create',
        );
        if (in_array($method, $nologin_methods) && \Auth::check()) {
            \Response::redirect('mobile/');
        }
        // CSRFチェック
        if (\Input::method() === 'POST') {
            if (!\Security::check_token()) {
                \Response::redirect('login/');
            }
        }
    }

    private function validate_create()
    {
        // 入力チェック
        $validation = \Validation::forge();
        $validation->add('username', 'ユーザー名')
                ->add_rule('required')
                ->add_rule('min_length', 4)
                ->add_rule('max_length', 15);
        $validation->add('password', 'パスワード')
                ->add_rule('required')
                ->add_rule('min_length', 6)
                ->add_rule('max_length', 20);
        $validation->add('email', 'Eメール')
                ->add_rule('required')
                ->add_rule('valid_email');
        $validation->run();
        return $validation;
    }

    public function action_index()
    {
        // ユーザー登録
        $validation = $this->validate_create();
        $errors = $validation->error();
        try {
                if (empty($errors)) {
                        $auth = \Auth::instance();
                        $input = $validation->input();
                        if ($auth->create_user($input['username'], $input['password'], $input['email'])) {
                                \Response::redirect('login/');
                        }
                        $result_validate = 'ユーザー作成に失敗しました。';
                } else {
                        $result_validate = $validation->show_errors();
                }
        } catch (\SimpleUserUpdateException $e) {
                $result_validate = $e->getMessage();
        }
        $this->template->title = 'ユーザー作成';
        $this->template->content = \View::forge('login/create');
        $this->template->content->set_safe('errmsg', $result_validate);
    }
}

3.「classes\controller」の下にlogout.phpを作ります。

fuel/app/modules/login/classes/controller/index.php

<?php

namespace Login;

class Controller_Logout extends \Controller_Template
{
    public function action_index()
    {
        // ログアウト処理
        \Auth::logout();
        \Response::redirect('login/');
    }
}

ここからはViewの部分の追加になります。

1.「views\」の下にtemplate.phpを作ります。

fuel\app\modules\login\views\template.php

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title><?php echo $title; ?></title>
</head>
<body>
  	<div id="wrapper">
		<?php echo $content; ?>
	</div>
</body>
</html>

2.「views\login\」の下にindex.phpを作ります。

fuel\app\modules\login\views\login\index.php

<?php echo $errmsg ?>
<p>
<form action="/login/" method="POST">
<!-- CSRF対策 -->
<input type="hidden" name="<?php echo \Config::get('security.csrf_token_key');?>" value="<?php echo \Security::fetch_token();?>" />
<div>
ユーザー名:<input type="text" name="username" value="" />
</div>
<div>
パスワード:<input type="password" name="password" value="" />
</div>
<input type="submit" value="ログイン" />
</form>
</p>
<p><a href="/login/create">新規ユーザー作成</a></p>

3.「views\login\」の下にcreate.phpを作ります。

<p>
<div>ユーザー情報</div>
<div><?php echo $errmsg ?></div>
<form action="/login/created" method="POST">
<!-- CSRF対策 -->
<input type="hidden" name="<?php echo \Config::get('security.csrf_token_key');?>" value="<?php echo \Security::fetch_token();?>" />
<div>
ユーザー名:<input type-"text" name="username" value="" />
</div>
<div>
パスワード:<input type-"password" name="password" value="" />
</div>
<div>
Eメール&nbsp;&nbsp;&nbsp;:<input type-"text" name="email" value="" />
</div>
<input type="submit" value="ユーザー作成" />
</form>
</p>
<p><a href="/login/">戻る</a></p>

2.まだまだあります。

FuelPHPのLoginモジュールを作りました。これからのコーディングにも役に立つと思います。次回もFuelPHPの機能の使い方を書くつもりです。またよろしくお願いします。