Routing ( การจัดการเส้นทางด้วย url )

ใช้ในการกำหนดว่าเมื่อเราเรียกลิ้งนี้จะให้ทำอะไรขึ้นบ้าง <a name="basic-routing"></a> ## Basic Routing

ในการตั้งค่าเราจะไปที่ app/routes.php โดยรูปแบบของฟังก็ชันที่เป็น Route จะเป็นแบบ Closure callback Closure คืออะไรตามไปตามเข้าไปอ่าน ที่นี่ครับ

การรับค่าที่เป็น get

1 Route::get('/', function()
2 {
3 	return 'Hello World';
4 });

การรับค่าที่เป็น POST

1 Route::post('foo/bar', function()
2 {
3 	return 'Hello World';
4 });

** การรับค่าได้หลายเเบบ **

เวอร์ชัน 4.1 ได้เพิ่มเมทอด match เพื่อช่วยให้เราไม่ต้องเขียน route get หรือ post สองตัว เพื่อรับค่าจาก route ชื่อเดียวกัน

1 Route::match(array('GET', 'POST'), '/', function()
2 {
3 	return 'Hello World';
4 });

กำหนด route ในการเรียกพารามิเตอร์ foo ในทุกรูปแบบเมทอด

1 Route::any('foo', function()
2 {
3 	return 'Hello World';
4 });

ลิ้งที่เรียกมาต้องเป็น https เท่านั้น

1 Route::get('foo', array('https', function()
2 {
3 	return 'Must be over HTTPS';
4 }));

<a name="route-parameters"></a> ## Route Parameters

ตัวอย่างการกำหนดรูปแบบของพารามิเตอร์

1 Route::get('user/{id}', function($id)
2 {
3 	return 'User '.$id;
4 });

พารามิเตอร์แบบมีหรือไม่มีก็ได้

1 Route::get('user/{name?}', function($name = null)
2 {
3 	return $name;
4 });

กำหนดพารามิเตอร์แบบตายตัว

1 Route::get('user/{name?}', function($name = 'John')
2 {
3 	return $name;
4 });

การใช้ regex ตรวจสอบว่าพารามิเตอร์ตรงกับที่กำหนดไว้ไหม

1 Route::get('user/{name}', function($name){})->where('name', '[A-Za-z]+');
2 
3 Route::get('user/{id}', function($id)
4 {
5 	//
6 })
7 ->where('id', '[0-9]+');

<br /><br /> จะใส่ไปเป็นอาเรย์ก็ได้

1 Route::get('user/{id}/{name}', function($id, $name)
2 {
3 	//
4 })
5 ->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))

<br /><br /> <a name="route-filters"></a> ## Route Filters

คือการกำหนดฟังก์ชันที่ใช้ในการตรวจสอบข้อมูล auth ใช้ตรวจว่ามีการล็อกอินไหม, guest ตรวจว่ายังไม่ได้ล็อกอิน, และ csrfตรวจว่าเป็นการทำ csrf ไหม.ซึ่งเราจะไปประกาศไว้ที่ app/filters.php

ตัวอย่างการสร้าง filter

1 Route::filter('old', function()
2 {
3 	if (Input::get('age') < 200)
4 	{
5 		return Redirect::to('home');
6 	}
7 });

การใส่ filter ให้ route

1 Route::get('user', array('before' => 'old', function()
2 {
3 	return 'You are over 200 years old!';
4 }));

<br /><br /><br /><br /> การใส่ route หลายตัว

1 Route::get('user', array('before' => 'auth|old', function()
2 {
3 	return 'You are authenticated and over 200 years old!';
4 }));

การกำหนดค่าเฉพาะให้ filter

1 Route::filter('age', function($route, $request, $value)
2 {
3 	//
4 });
5 
6 Route::get('user', array('before' => 'age:200', function()
7 {
8 	return 'Hello World';
9 }));

filter บางตัวเราสั่งให้ทำงานหลังจากที่ route ทำงานไปแล้วเราต้องกำหนดตัวแปร $response เพื่อกำหนดค่าที่จะส่งไปให้ตัวฟังก์ชันด้วย

1 Route::filter('log', function($route, $request, $response, $value)
2 {
3 	//
4 });

การกรองแบบมีรูปแบบ

เราสามารถกำหนด filter ให้ทำงานเฉพาะเมื่อมีการเรียกตรงกับที่เรากำหนดได้ ตามตัวอย่างเลยครับ.

1 Route::filter('admin', function()
2 {
3 	//
4 });
5 
6 Route::when('admin/*', 'admin');

ตามตัวอย่างเราเพิ่ม filter ชื่อ admin เข้ากับทุกลิ้งที่มี admin/ อยู่ข้างใน <br /> แล้วก็ยังสามารถกำหนดเมทอดให้ได้ด้วย

1 Route::when('admin/*', 'admin', array('post'));

Filter Classes

ในการกรองขั้นสูงเราสามารถสร้างคลาสขึ้นมาได้เอง แล้วทำการใช้ IoC Container เรียกใช้คลาสนั้น

ตัวอย่างคลาส

1 class FooFilter {
2 
3 	public function filter()
4 	{
5 		// Filter logic...
6 	}
7 
8 }

ลงทะเบียนคลาสโดยให้ชื่อที่จะนำไปใช้ว่า foo

1 Route::filter('foo', 'FooFilter');

<a name="named-routes"></a> ## Named Routes

คือการตั้งชื่อย่อให้กับ route:

1 Route::get('user/profile', array('as' => 'profile', function()
2 {
3 	//
4 }));

กำหนดให้ชื่อย่อนี้จะใช้ controller ไหน

1 Route::get('user/profile', array('as' => 'profile', 'uses' => 'UserController@sho\
2 wProfile'));

ตอนนี้เราใช้ชื่อย่อ เพื่อสร้างลิ้งได้เเล้ว

1 $url = URL::route('profile');
2 
3 $redirect = Redirect::route('profile');

เราใช้เมทอดcurrentRouteName เพื่อดึงชื่อของ Route ที่ทำงานในขณะนี้ได้

1 $name = Route::currentRouteName();

<a name="route-groups"></a> ## Route Groups

เราสามารถกำหนดกลุ่มให้ Route ได้ทำให้สะดวกมากขึ้น

 1 Route::group(array('before' => 'auth'), function()
 2 {
 3 	Route::get('/', function()
 4 	{
 5 		// Has Auth Filter
 6 	});
 7 
 8 	Route::get('user/profile', function()
 9 	{
10 		// Has Auth Filter
11 	});
12 });

<a name="sub-domain-routing"></a> ## Sub-Domain Routing

การสร้าง Route ให้กับโดนเมนย่อย

1 Route::group(array('domain' => '{account}.myapp.com'), function()
2 {
3 
4 	Route::get('user/{id}', function($account, $id)
5 	{
6 		//
7 	});
8 
9 });

<a name="route-prefixing"></a> ## Route Prefixing

ในการกำหนดคำที่ใช้กำหนดกลุ่มของ เราใช้ prefix ในการตรวจสอบ

ตัวอย่างการใช้ prefix

1 Route::group(array('prefix' => 'admin'), function()
2 {
3 
4 	Route::get('user', function()
5 	{
6 		//
7 	});
8 
9 });

<a name="route-model-binding"></a> ## Route Model Binding

คือการผูกโมเดลเขาไปกับ Route โดยใช้เมทอด Route::model

การใช้งาน

1 Route::model('user', 'User');

ต่อมาก็กำหนดให้เมื่อมีการเรียกลิ้งที่มี {user}เป็นพารามิเตอร์

1 Route::get('profile/{user}', function(User $user)
2 {
3 	//
4 });

เราก็จะทำการแทรก User instance เข้าไปใน Route ยกตัวอย่าง profile/1 ถูกเรียก User instance ก็จะมี ID = 1.

ถ้าพารามิเตอร์ที่ส่งเข้ามาไม่ตรงกับ model ใดๆเราสามารถกำหนดการแสดงข้อผิดพลาดำได้

1 Route::model('user', 'User', function()
2 {
3 	throw new NotFoundException;
4 });

ต่อมา เมทอด Route::bind เป็นการผูกพารามิเตอร์เข้ากับ โมเดล เมื่อมีการส่งค่าเข้าตรงกับ route ที่กำหนดค่าก็จะก็จะถูกส่งมาที่เมทอดนี้ก่อน

1 Route::bind('user', function($value, $route)
2 {
3 	return User::where('name', $value)->first();
4 });