WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
開発メモ2_UserController及びUserビュー

開発メモ2_UserController及びUserビュー

このエントリーをはてなブックマークに追加

users関連のデータベーステーブルが完成したら、UserControllerを作成して、ログイン関連のコードを作成。

ログイン関連のコードは、UserControllerで作成するか、LoginControllerを作成するか迷ったが、とりあえず、UserControllerで作成することに決定。

ユーザー作成における問題点

基本的に、ユーザーの新規作成に関しては、Adminが一括して作成する予定だが、関連業者(取引先)のユーザーも全てAdminが作成するかどうかは思案中。

以下にいくつかの案と問題点及び現状考えうる対策を記述

  1. 全ユーザーの新規作成は、Adminが担当する案
    1. ユーザー数が多くなれば、Adminの仕事量が増える。
    2. Adminの入力ミスによる架空ユーザーの作成の可能性あり。
      • メールによるアクティベートで対応
    3. usersテーブル内の架空ユーザーデータが発生する可能性あり。
      • アクティベート専用のテーブルを作成して、アクティベート後に自動的に削除するプログラムで対応
  2. 関連業者に、関連業者内のユーザー管理担当者を作成して、新規作成してもらう案
    1. 勝手に、架空ユーザーが作成される可能性あり。
      • 上記2.3と同様に対応する。
  3. 各ユーザーにユーザーの新規作成をしてもらう案
    1. メールによるアクティベートだけでは、不安なので、他にセキュリティ対策が必要。

UserControllerの作成

app/controllers/UserController.php
<?php
class UserController extends BaseController{
/*
|----------------------------------------
| コンストラクター
|----------------------------------------
*/
public function __construct(){
//authフィルター
$this->beforeFilter('auth',array(
//フィルター適用の指定
'only'=>array('getIndex')));
//全POSTにcsrfフィルターの適用
$this->beforeFilter('csrf',array('on'=>'post'));
}
/*
|------------------------------------
| TOPページ(authフィルターの適用)
|------------------------------------
*/
public function getIndex(){
return View::make('user/index');
}
/*
|-----------------------------------
| 新規作成
|-----------------------------------
| 1.GETでビューの表示
| 2.POSTでユーザー仮登録
| 3.仮登録後、アクティベートメールの送信
*/
//GETの処理
public function getCreate(){
return View::make('user/create');
}
//POSTの処理
public function postCreate(){
//受信データの整理
$inputs=Input::only('name','email','password');
//バリデーションの指定
$rules=array(
'name'=>'required',
'email'=>'required|email|unique:users',
'password'=>'required|min:4',
);
//バリデーションチェック
$val=Validator::make($inputs,$rules);
//バリデーションNGなら
if($val->fails()){
return Redirect::back()
->withErrors($val)
->withInput();
}
//ユーザーの新規作成
$inputs['onepass']=md5(Input::get('name').time());
$user=User::create($inputs);
//アクティベートメールの送信
$data['onepass']=$inputs['onepass'];
$data['username']=Input::get('name');
Mail::send('emails.auth.activate',$data,function($m){
$m->to(Input::get('email'),Input::get('name'))
->subject('アクティベート手続き');
});
return $user->name.'さん。<br>メールを送信しましたので、アクティベート手続きをして下さい。';
}
/*
|-----------------------------------------
| アクティベート
|-----------------------------------------
*/
Public function getActivate($onepass=null){
//メール添付のワンパス検索OKなら
if($user=User::where('onepass','=',$onepass)->first()){
//アクティベート
$user->activate=1;
//ワンパスの変更
$user->onepass=md5($user->username.time());
//データ保存
$user->save();
//トップページへリダイレクト
return Redirect::to('user');
//一致するワンパスがなければ
}else{
return 'アクティベートできません。';
}
}
/*
|-----------------------------------------
| ログイン
|-----------------------------------------
*/
public function getLogin(){
return View::make('user/login');
}
public function postLogin(){
//受信データの整理
$inputs=Input::only('email','password');
//バリデーションの指定
$rules=array(
'email'=>'required|email',
'password'=>'required|min:4',
);
//バリデーションチェック
$val=Validator::make($inputs,$rules);
//バリデーションNGなら
if($val->fails()){
return Redirect::back()
->withErrors($val)
->withInput();
}
//ログイン認証
$inputs['activate']=1;
if(Auth::attempt($inputs)){
return Redirect::intended('/');
}
return 'ログインできません';
}
/*
|-----------------------------------------
| ログアウト
|-----------------------------------------
*/
public function getLogout(){
Auth::logout();
return Redirect::to('/');
}

}
  • 新規作成からアクティベートの部分は、現状では、セキュリティ的に甘いので、不採用予定。何かいい対策を思いついたら、個人ユーザーによる新規ユーザー作成も再考する。

Userビューの作成

app/views/user/index.blade.php
@extends('layouts.f4.base')
@section('content')
<h4>ようこそ{{ Auth::user()->name }}さん</h4>
<p>UserのTOPページです。</p>
@stop
app/views/login.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta name="viewport" content="width=device-width,minimum-scale=1">
<title>ログイン</title>
{{ HTML::style('login.css')}}
</head>
<body>
{{ Form::open(array('class'=>'form-container')) }}
<!--<form class="form-container">
--><div class="form-title"><h2>Sign up</h2></div>
<div class="form-title">Mail</div>
{{ Form::text('email',Input::old('email',''),array('class'=>'form-field')) }}<br>
@if($errors->has('email'))
<h4 style="color:red;text-align:center">{{ $errors->first('email') }}</h4>
@endif
<div class="form-title">Password</div>
<input class="form-field" type="password" name="password" /><br />
@if($errors->has('password'))
<h4 style="color:red;text-align:center">{{ $errors->first('password') }}</h4>
@endif
<div class="submit-container">
<input class="submit-button" type="submit" value="Singn Up" />
</div>
{{ Form::close() }}
</body>
</html>
app/views/user/create.blade.php
@extends('layouts.f4.base')
@section('content')
<h3>ユーザー新規作成</h3>
{{ Form::open() }}
{{ Form::label('name','氏名') }}
{{ Form::text('name',Input::old('name','')) }}
@if($errors->has('name'))
<h4 style="color:red;text-align:center">{{ $errors->first('name') }}</h4>
@endif
{{ Form::label('email','メール') }}
{{ Form::text('email',Input::old('email','')) }}<br>
@if($errors->has('email'))
<h4 style="color:red;text-align:center">{{ $errors->first('email') }}</h4>
@endif
{{ Form::label('password','パスワード') }}
{{ Form::password('password') }}<br>
@if($errors->has('password'))
<h4 style="color:red;text-align:center">{{ $errors->first('password') }}</h4>
@endif
{{ Form::submit('新規作成',array('class'=>'button')) }}
{{ Form::close() }}
@stop
app/views/emails/auth/activate.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
</head>
<body>
<h2>アクティベート手続き</h2>
<div>
<h3>{{ $username }}さん、ようこそ!</h3>
<p>あなたのユーザー登録申請を受け付けました。</p>
<p>下記のURLをクリックすると、新規ユーザー作成手続きが、完了します。</p>
<p>{{ URL::to('user/activate', array($onepass)) }}</p>
<p>ありがとうございました。</p>
</div>
</body>
</html>

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です