เรียนรู้ Laravel 4.1 เรื่อง ( Route )

laravel_route

หลังจากหายไปศึกษาจากคลิปในเน็ตไม่ค่อยได้อัพเลยจึงจะทยอยอัพเดทกันนะครับ ความรู้ถ้าหากเพื่อนๆคนไหนอยากจะใช้เวอร์ชั่นใหม่ก็ไม่ต่างจากเวอร์ชั่นนี้เท่าไรก็ลองศึกษากันดูครับ เรื่องนี้จะเกี่ยวกับเรื่องการ Route หรือการเปลี่ยนเส้นทางเวลาที่มีการ request เรียกเข้ามายังเว็บเรา ผู้ใช้ Laravel ควรจะเรียนรู้เรื่องนี้เป็นเรื่องแรกครับ

เริ่มต้นกับ Route และการ Install

ให้ทำการลง composer ในเครื่องก่อนครับ composer คือะไร ? คือโปรแกรมจัดการพวกไฟล์ต่างๆเวลาที่เราต้องการ lib หรือไฟล์ code บางอย่างที่ตัวนี้อาจจะต้องการ lib ตัวอื่นอีกการมานั่งจัดการวางไฟล์ไว้ไหน ต้องเรียกไฟล์พวกนี้มาใส่ไว้ไหน ปัญหาเหล่านี้ตัว composer  เกิดมาเพื่อจัดการครับผมไม่อธิบายแล้วกันคิดว่าควรจะเป็นถ้าไม่เป็นบอกใน comment เดี๋ยวจะสอนลงให้นะครับ เมื่อเครื่องเรามี composer ให้เราใช้ command line ใน Terminal สำหรับ mac และ cmd สำหรับ window ครับใส่ตามนี้เลย

composer create-project laravel/laravel [project-name]

เราจะได้โปรเจ็ตมาในตัวอย่างของผมจะสร้างไว้ชื่อว่า laravel เลยง่ายดี หากลงแล้วมีปัญหา ซึ่งคิดว่าน่าจะมีกันทุกคนคือ ไม่มีตัว extension mcrypt จะมี error แบบนี้

Mcrypt PHP extension required.

แนะนำว่าถ้าใช้พวก MAMP หรือ XAMPP เปิด extension ตัวนี้แล้วก็สั่งให้ตัว PHP มาอ่านครับ ถ้าไม่ได้ก็ google เลยแต่จำได้ว่าปัญหานี้ผมติดอยู่พักใหญ่เหมือนกันแต่อันนี้ไม่ได้จะสอนเรื่องนี้นะครับใครติดอะไรก็ถามเอาใน comment นะครับ

ถ้าทุกอย่างโอเคเข้า localhost/projectname/public ( เดี๋ยวจะบอกว่าวิธีเอา public ออกให้นะไม่ต้องใจร้อน ) ในตัวอย่างของเราคือ localhost/laravel/public ก็จะเจอหน้าแรกของ Laravel เป็นอันเสร็จพิธีลงจ้า

วิธีเอา public ออกจาก url

วิธีแรกให้เราแก้ไขในไฟล์ตอนทำ virtual host ไปอ่านใน public เลยเช่น

<VirtualHost *>
   DocumentRoot "/Applications/MAMP/htdocs/stock/public"
   ServerName stock.com
</VirtualHost>

วิธีที่สองคือ เอาโค้ดด้านล่างไปใส่ .htaccess ต้องวางใน folder laravel project นะครับเช่นถ้าผมมี folder stock ซึ่งเก็บไฟล์ laravel ไว้ก็สร้าง .htaccess ไว้ใน folder stock ครับโค้ดตามนี้

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

วิธีที่สามคือ

  • ให้เราสร้าง folder ชื่อ laravelfiles และเอาทุกอย่างไปใส่ในนี้ยกเว้น folder public
  • ให้เราเอาทุกไฟล์ใน public ออกมาไว้ข้างนอกหรือพูดง่ายๆคือ copy ออกมาอยู่ลำดับเดียวกับ public folder ครับ
  • ไปแก้ไขโค้ดในการเรียกให้ถูกต้องโดยมีสองตัวคือ bootstrap/paths.php เปลี่ยน ‘public’ => __DIR__.’/../../’,
  • ไปแก้ไข index.php ซึ่งตอนนี้จะอยู่ที่ root ของ folder project เรา copy มันออกมาจาก public ครับแก้ไขเป็นดังนี้
require __DIR__.'/laravelfiles/bootstrap/autoload.php';

$app = require_once __DIR__.'/laravelfiles/bootstrap/start.php';

 

สร้างไฟล์ .htaccess หากมองไม่เห็นแล้ว copy โค้ดตรงนี้ไปครับ

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

RewriteEngine On


# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>

แค่นี้เราก็สามารถเรียกใช้เว็บโดยไม่ต้องมี public แล้วครับ

Routing

ใน Laravel เราต้องสร้าง Code สำหรับการรองรับการ request ต่างๆกันเช่นส่ง url แบบนี้มาเป็น GET ก็ต้องเขียนรับหรือเป็น POST เราก็ต้องเขียนรับครับเรามา  Hello world โดยการเรียกแบบ GET กันดีกว่าครับ เปิดไฟล์ app/route.php ครับแล้วเพิ่มโค้ดดังนี้

Route::get('hello', function() {
     echo 'hello world';
});

แล้วลองเรียก url ดังนี้ครับ

localhost/laravel/public/hello

ก็จะเจอคำว่า hello world ครับส่วนแบบ POST ทำคล้ายกันเลยครับแต่เราต้องมีหน้าสำหรับ form input ก่อนครับ หากบางคนนั้นไม่มีตัว extension postman ใน chrome ที่สามารถจำลองการส่งค่าได้ก็ให้สร้างหน้า form ง่ายๆก่อนครับโดย save ไว้ที่ folder views นะครับชื่อว่า input.php ก็ได้ครับโค้ดเป็นตามนี้

<form action="">
	<input type="text" name="name" value="" />
	<input type="submit"  value="Submit" />
</form>

แล้วในส่วนของ route.php นั้นใส่โค้ดอย่างนี้ครับ

Route::get('hello', function() {
	return View::make('input');
});

Route::post('hello', function() {
	return Input::all();
});

ถ้าเราเรียก localhost/laravel/public/hello ตอนแรกจะเป็นการเรียกเข้าสู่ get คือเรียก form หน้า input มาครับ code ที่เขียนว่า View::make(‘input’); เหมือนกัน render หน้า html ครับแล้วเมื่อเรากรอกค่าแล้วกด submit หน้าจอจะโชว์ค่าที่ส่งมาคือ name มีค่าเหมือนที่เรากรอกครับ

การกำหนดการรับค่า Parameter ใน url

บ่อยครั้งที่เราต้องการให้ส่งค่าตรงส่วนไหนเป็นอะไร เช่นต้องการเป็น id ก็ต้องเป็นตัวเลขเท่านั้นกรณีอย่างนี้เราสามารถกำหนดได้ครับว่าจะรับค่าแบบไหนถ้าส่งมาไม่ถูกเราก็ส่งเป็นค่า error กลับไปได้ครับ

Route::get('post/{id?}', function($id) {
   return 'post=' . $id;
})->where('id', '[0-9]+');

ใช้ where ในการใส่ Regex  แต่หากเราลองเรียกดูถ้าเราไม่ส่งค่า id จะเกิด error ขึ้นซึ่งเราสามารถกำหนดค่า Default หรือค่าเริ่มแรกไว้ได้ครับโดยการใส่โค้ดแบบนี้

Route::get('post/{id?}', function($id = '0') {
	return 'post=' . $id;
})->where('id', '[0-9]+');

$id=0 จะไม่ทำให้หน้า error

การตั้งชื่อย่อของ Route

บ่อยครั้งเราต้องการอ้างอิงถึง Path เช่น อยากเรียกสั้นๆ ทำได้ดังนี้

Route::get('/laravel/blog/board', array('as' => 'board', function() {
    return View::make('board');
});

ลองเรียนในหน้า View ดูเช่น

echo URL::route(‘board’); ผลที่ได้คือ

www.domainname.com/laravel/blog/board หรือถ้าทำในเครื่องก็จะเป็น localhost/laravel/blog/board

การจัดกลุ่มให้กับ Route

บางครั้งเราต้องการหน้าที่ต้อง Login ก่อนแล้วเราต้องมานั่งเขียนการเช็คต้อง Include ไฟล์ต่างๆมาแต่ใน laravel ทำได้ง่ายครับดังนี้

Route::group(array('before' => 'auth'), function() {

   Route::get('index', function() {
     return View::make('index');
   });


   Route::get('board', function() {
     return View::make('board');
   });
});

ให้สร้างไฟล์หน้า index.php, login.php, board.php โดยใส่ echo ‘This is login form.’; ในหน้า login.php ที่เหลือสองไฟล์ปล่อยไว้ไม่ต้องใส่อะไร ถ้าหากทำถูกต้องมันจะแสดงผลหน้า login.php เพียงอย่างเดียวลองเข้า url แบบนี้ดูครับ

localhost/laravel/public/index หรือ localhost/laravel/public/board ดูครับ

การกรองข้อมูลด้วย filter

Route::get('post', function() {
return View::make('post');
});

Route::post('post', array('before' => 'old', function() {
  $age = Input::get('value');
  return 'You age is ' . $age;
}));

Route::filter('old', function() {
  if(Input::get('value') < 200)
  {
    return 'You are not Allowed';
  }

});

เมื่อเรากรอกค่าตัวเลขที่ใส่ใน form ถ้าหากค่านั้นเป็นตัวเลขที่ตำ่กว่า 200 เราจะไม่ถูกนำไปหน้าของ post ครับเพราะว่ามีการกรองก่อนที่จะถึงหน้านั้นแล้วทำการหยุดก่อนจะไปถึงหน้า post ครับ

การสร้าง Prefix ให้กับ Route

Route::group(array('prefix' => 'admin'), function() {

  Route::get('index', function() {
    return View::make('index');
  });


   Route::get('board', function() {
     return View::make('board');
   });
});

 

จากปกติเราเข้า url localhost/laravel/public/index ก็จะมี admin นำหน้าถึงจะเข้าได้

localhost/admin/public/index

ก็สามารถสร้างหน้าสำหรับ Admin ได้แหละ

สรุป

เราได้เรียนรู้กันไปสำหรับการ Route ซึ่งจะเป็นพื้นฐานของ framework สมัยใหม่โดยการทำก็ง่ายและยังคงมีอีกหลายแบบให้เราได้ลองเรียนรู้กันต่อครับ ใครมีข้อสงสัยอะไรก็สามารถสอบถามได้ที่ comment หรือจะไปถามในคลิกก็ได้ครับ ผมก็เรียนจากคลิปของ credit ที่แปะไว้แล้วติดตามตอนนี้ไปครับ

Credit

พอดีผมได้ไปศึกษาจากคลิปนี้ //www.youtube.com/user/laraveltut สามารถเข้าไปติดตามหรือเรียนจากคลิปได้ครับ

แล้วมาเขียนอธิบายเพิ่มเติมครับจึงอยากแชร์ต่อไว้โดยผมจะพยายามเขียนอธิบายคนที่ไม่เคยใช้หรือไม่เข้าใจมาก่อน หากมีคำถามใดๆสามารถเขียน comment ถามไว้ได้เลยครับถ้าผมว่าจะตอบทันที

One response to “เรียนรู้ Laravel 4.1 เรื่อง ( Route )”

ฝากข้อคิดเห็น

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: