laravel - Register system แบบ (MVC)

STEP 1 - ก่อนจะเปิดหน้า Register ได้เราต้อง > สร้าง Route


[code]
Route::get('register', function()
{
  return View::make('register');
});
[/code]

อธิบาย
เมื่อมีการเข้า http://localhost/laravel/public/index.php/register
จะเรียกใช้ไฟล์ register.blade.php ในโฟล์เดอร์ Views

........................................................................................................



STEP 2 - สร้าง View

[code] register.blade.php
@extends('default') 

@section('content')
{{ Form::open(array('url' => 'register_action')) }}
    <p>Name :</p>                        <p>{{ Form::text('name') }}</p>
    <p>Email :</p>                        <p>{{ Form::text('email') }}</p>
    <p>Password :</p>                  <p>{{ Form::password('password') }}</p>
    <p>Confirm Password :</p>    <p>{{ Form::password('cpassword') }}</p>
    <p>{{ Form::submit('Submit') }}</p>
{{ Form::close() }}


//ดัก Error ทั้งหมดที่ส่งมาจาก Controller @if ($errors)
@if($errors->has()) @foreach ($errors->all() as $error) {{ $error }} @endforeach @endif

//ดัก Message ถ้าสมัครสมาชิกเรียบร้อยจะแสดง Message ออกมา
@if (Session::has('message')) 
  {{ Session::get('message') }}
@endif

@stop

อธิบาย
{{ Form::open(array('url' => 'register_action')) }}
{{ Form::close() }}

จะเหมือนกับ
<form action="http://localhost/function/register_action.php" >
</form>

แต่แบบด้านบน จะมีการ Random Token เป็น Hidden Input Field
เพื่อป้องกันการโจมตีแบบ CSRF
.................................................................................................................................


STEP 3 - สร้าง Route ให้  Register Form

แบบสั้นๆ
Route::post('register_action', 'UserController@register', array('before' => 'csrf'));

หรือบางครั้งอาจ ต้องการแทรกเงื่อนไข
ก็สามารถเขียน Route แบบนี้ได้เช่นกัน

[code]
Route::post('register_action', array('before' => 'csrf', function()
{
        $obj = new UserController() ;
        return $obj->register();
});

อธิบาย

เมื่อมีการกดปุ่ม Register จะเรียกใช้งานคลาส UserController  ที่เมธอท : register()
....................................................





STEP 4

UserController  รับค่าจาก Route มาตรวจสอบ และส่งต่อให้ Model เพื่อ Insert ลงฐานข้อมูล


UserController.php

<?php

class UserController extends BaseController {

         public function store() {

            $data =  array('name' => Input::get('name'),
                                    'email' => Input::get('email'),
                                     'password' => Hash::make(Input::password('password'),
                                      'cpassword' => Input::get('cpassword'));

            $rule  =  array(
                    'name'          => 'required|unique:registered_users,name',
                    'email'          => 'required|email|unique:registered_users,email',
                    'password'    => 'required|min:6|',
                    'cpassword'  => 'required|min:6|same:password'
            ); 

            $validator = Validator::make($data,$rule);
            if ($validator->fails()) {
                    return Redirect::back()->withErrors($validator);
            } else {
                    User::register($data);
                    return Redirect::back()->withMessage('สมัครสมาชิกเรียบร้อย');
            }



      }  // end store()
} // end class UserController




อธิบาย
1.รับค่าใส่ตัวแปร + ตรวจสอบ _token ป้องกัน CSRF ซึ่ง laravel สร้างให้เราในทุกๆฟอร์ม
$data =  Input::except(array('_token'));

2.กำหนด $rule ดังนี้
name            =>  ต้องกรอก | ห้ามซ้ำ
email            => ต้องกรอก | รูปแบบอีเมล | ห้ามซ้ำกับ Column : name
password     => ต้องกรอก | ยาวอย่างต่ำ 6 | ต้องเหมือนกับ cpassword
cpassword   => ต้องกรอก | ยาวอย่างต่ำ 6

3.นำ $data ตรวจสอบกับ Roule โดยใช้คลาส
Validator::make()

แบบนี้
$validator = Validator::make($data,$rule);

และนำตัวแปร $validator ไปตรวจสอบ

ถ้า $validator->fails() 
จะ return error  ไปที่  : Views/register.blade.php  << ที่มีการเขียน foreach รอไว้ใน view

ถ้าผ่าน Roule (ตรงตามกฏที่กำหนด) 
จะส่ง Input ไปที่ Model  : User ที่เมธอท : register   (ใน STEP 5)
และ Return ผลลัพธ์ true หรือ false กลับไปที่ Controller  -> View
เพื่อทราบผลการลงทะเบียน

............................................................................................




STEP5 - สร้าง Model เพื่อเพิ่มข้อมูลลงฐานข้อมูล

อธิบาย
รับ Data เข้ามา เพื่อ insert ลงฐานข้อมูล
.......................................


[User.php]

<?php 

class User extends Eloquent {

        public static function saveFormData($data)
        {
            DB::table('registered_users')->insert($data);
        }

}