คู่มือการใช้งาน Laravel 4
คู่มือการใช้งาน Laravel 4
Krissanawat Kaewsanmuang
Buy on Leanpub

Table of Contents

แนะนำตัวกันก่อน

<a name="laravel-philosophy"></a> ## ปรัชญาของ Laravel

Laravel เป็น php framework ที่เน้นไปที่ความเรียบง่ายของการใช้งานตัวแปรต่างๆ . เราเชื่อว่าในการพัฒนาเว็บของคุณต้องเต็มไปด้วยความสนุกสนานแน่นอน,ประสบการณ์ความคิดสร้างสรรค์ที่จะตอบสนองความต้องการอย่างแท้จริง. Laravel พยายามลดงานในระหว่างการพัฒนาโดยสร้างระบบสำเร็จรูปมาให้อย่าง authentication, routing, sessions, และ caching.

Laravel ที่จะเป็นหนึ่งใน เครื่องมือในการพัฒนาที่นักพัฒนาชื่นชอบ และสามารถใช้งานได้โดยที่ไม่ต้องเสียสละฟังก์ชันไหนไปเลย เราเชื่อว่า นักพัฒนาที่มีความสุขจะสร้างโค้ดที่เยี่ยมยอด เราพยายามนำสิ่งที่ดีของภาษาอื่นๆ เช่น Ruby on Rails, ASP.NET MVC, และ Sinatra เข้ามาผสมผสานเข้ากับ laravel

Laravel เตรียมเครื่องมือที่ใช้เพื่อการสร้างเว็บแอพลิเคชัน ที่ยืดหยุ่นด้วย inversion of control container,ระบบ migration , และการทำ unit testing ที่แสนง่ายดาย

<a name="learning-laravel"></a> ## เรียนรู้ Laravel

หนึ่งในทางเลือกที่ดีคือการศึกษาคู่มือการใช้งาน หรือซื้อหนังสือในนี้ครับ

<a name="development-team"></a> ## นักพัฒนาหลัก

Laravel ถูกสร้างโดย Taylor Otwell, และ Dayle Rees, Shawn McCool, Jeffrey Way, Jason Lewis, Ben Corlett, Franz Liedke, Dries Vints, Mior Muhammed Zaki, และ Phil Sturgeon.

<a name="framework-sponsors"></a> ## ผู้สนับสนุน Laravel

Installation

การติดตั้ง laravel

<a name="install-composer"></a> ## Install Composer

Laravel ใช้ Composer ในการจัดการไลบราลี่ต่างๆ รวมจนถึงคลาสหลักของระบบ เริ่มแรกเราต้องไปโหลด composer.phar. เราจะได้ไฟล์ที่มีนามสกุลเป็น phar มาแล้วเอาไปวางไว้ที่ usr/local/bin เพื่อให้ระบบมองเห็น บนวินโดเรามี Windows installer อยากรู้เพิ่มเติมเข้าไปดูได้ ผมได้ทำการสรุปไว้

<a name="install-laravel"></a> ## การติดตั้ง Laravel

ใช้ Composer ในการติดตั้ง

พิมพ์คำสั่งข้างล่างไปที่ commandline composer จะทำการดาวน์โหลดมาลงตรงที่เราเรียกใช้

1 composer create-project laravel/laravel project-name

ดาวน์โหลดเอง

เมื่อติดตัง laravel เวอร์ชันล่าสุด แล้วก็แตกไฟล์ไปลงที่โฟลเดอร์ของ server เปิด command line เลือกที่อยู่ให้ตรงกับที่เอา laravel ไปวางแล้วรันคำสั่ง php composer.phar install (หรือ composer install) ก็เสร็จสิ้น

ถ้าเราต้องการอัพเดทก็ใช้คำสั่ง php composer.phar update

<a name="server-requirements"></a> ## ความต้องการของระบบ

  • PHP >= 5.3.7
  • MCrypt PHP Extension

<a name="configuration"></a> ## การตั้งค่า

laravel ไม่ได้ต้องการปรับแต่งอะไรมากเพียงแค่เราเข้้าไปที่ app/config/app.php โดยอาจปรับแค่ timezone กับ locale

Note: และมีค่า key ที่อยู่ใน app/config/app.php. เราต้องใช้คำสั่ง php artisan key:generateเพื่อสร้างคีย์ที่จะใช้สร้าง private key ในการสร้างรหัสผ่าน hash ในระบบ

<a name="permissions"></a> ### สิทธิ laravel ต้องการสิทธิในการอ่านเขียนโฟลเดอร์ app/storage

<a name="paths"></a> ### เส้นทาง

การกำหนดเส้นทางสามารถทำได้ที่ bootstrap/paths.php

<a name="pretty-urls"></a> ## URLs ที่สวยงาม

laravel เตรียมไฟล์ public/.htaccess ที่อนุญาตให้เราเรียกใช้งานโดยไม่ต้องใส่ index.php. โดยต้องการใช้งานขอ mod_rewrite บน server ก่อน

การเริ่มต้นอย่างรวดเร็ว

หมายเหตุ :: url ที่เราจะเรียกใช้งานในตอนเริ่มแรกคือ localhost หรือ 127.0.0.1 ตามด้วยชื่อโฟลเดอร์ของเว็บที่เราสร้าง แล้วตามด้วย public นะครับ ยกตัวอย่าง 127.0.0.1/taqmaninw/public นะครับ

บททนี้จะทำให้เราเห็นภาพรวมของ laravel นะครับ

<a name="installation"></a> ## การติดตั้ง

ถ้าไม่รู้จัก composer แนะนำไปอ่าน ที่นี้ ก่อน เริ่มจากใช้คำสั่ง

1 composer create-project laravel/laravel projectname --prefer-dist

หลังจากนั้น composer จะทำการดาวน์โหลดไฟล์ต่างๆ มาเก็บที่โฟลเดอร์ที่เรากำหนดชื่อไว้

หลังจากนั้นก็ทำความรู้จักกับ โครงสร้างโฟลเดอร์ของ laravel เริ่มแรกเราต้องไปกำหนดค่าต่างๆ ที่โฟลเดอร์ app/config ก่อนในนี้ก็จะมีการตั้งค่าให้มากมายแต่เราอาจต้องการแค่

<a name="routing"></a> ## Routing ( การจัดการเส้นทาง ) เราต้องกำหนด url ที่เราจะอนุญาตให้เข้าถึง ฟังก์ชันต่างก่อนที่ app/routes.php ตัวอย่างการสร้าง Route เบื้องต้น

1 Route::get('users', function()
2 {
3 	return 'Users!';
4 });

ตอนนี้เมื่อเราพิมพ์ชื่อโปรเจคของเราบนบราวเซอร์แล้วตามด้วย /users เราจะเห็นคำว่า Users! แสดงอยู่

การสร้าง Route ไปหา Controller

1 Route::get('users', 'UserController@getIndex');

ตอนนี้ /user จะถูกส่งไปที่ฟังก์ชน getIndex ของ UserController
<br /><br /> <a name="creating-a-view"></a> ## การสร้าง View

ต่อมาเรามาสร้างไฟล์ที่จะใช้จัดการรูปแบบในการแสดงผลที่โฟลเดอร์ app/views เราสร้างไฟล์ที่ชื่อ layout.blade.php และ users.blade.phpต่อด้วย layout.blade.php

1 <html>
2 	<body>
3 		<h1>Laravel Quickstart</h1>
4 
5 		@yield('content')
6 	</body>
7 </html>

ต่อมาในไฟล์ users.blade.php เราจะดึงไฟล์ layout มาลง

1 @extends('layout')
2 
3 @section('content')
4 	Users!
5 @stop

เพื่อความไม่งงว่าตัวแปรเหล่านี้คืออะไร ตามไปอ่านเรื่อง template เลยครับ

ถ้าเราจะแสดงไฟล์ view ที่เราสร้างก็ต้องอาศัย Route ดังตัวอย่าง

1 Route::get('users', function()
2 {
3 	return View::make('users');
4 });

ต่อไปเราจะไปลุยดาต้าเบสกันนะครับ <br /> <a name="creating-a-migration"></a> ## การทำ Migration

เราจะใช้คลาส Migration ในการจัดการฐานข้อมูลนะครับ เริ่มต้นด้วยการตั้งค่าในการเชื่อมต่อฐานข้อมูลก่อนที่ไฟล์ app/database ในค่าเริ่มต้นเเล้วอาเรย์ driverจะเป็น mysql แล้วเราก็เปลี่ยนค่าตรง mysql เป็นข้อมูลในการเชื่อมต่อฐานข้อมูลของเรา

ต่อมาในการสร้าง migration เราใช้ คำสั่ง artisan ใน commandline จากในโฟลเดอร์โปรเจคของเรา ตัวอย่าง

1 php artisan migrate:make create_users_table

ต่อมาไฟล์ migrration จะไปโผล่ที่โฟลเดอร์ app/database/migrations ในไฟล์จะมีฟังก์ชัร up และ down เราจะสร้าง Schema เพื่อการจัดการฐานข้อมูล

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

 1 public function up()
 2 {
 3 	Schema::create('users', function($table)
 4 	{
 5 		$table->increments('id');
 6 		$table->string('email')->unique();
 7 		$table->string('name');
 8 		$table->timestamps();
 9 	});
10 }
11 
12 public function down()
13 {
14 	Schema::drop('users');
15 }

ต่อมาเราก็รันคำสั่ง

1 php artisan migrate

ถ้าอยากย้อนคำสั่ง migrate เราต้องใช้คำสั่ง migrate:rollback <br /> <a name="eloquent-orm"></a> ## Eloquent ORM

Eloquent คือ ชุดคำสั่งที่เราใช้ในการทำ sql query นั่นเองครับ ช่วยให้เราสะดวกสะบาย ทำงานได้รวดเร็วขึ้น เริ่มแรกเราต้องไปสร้าง model ที่โฟลเดอร์ app/models โดยตั้งชื่อว่า User.php ตัวอย่างการประกาศคลาสในโมเดล

1 class User extends Eloquent {}

ตัวอย่างการเรียกใช้ Eloquent Model ครับ

1 Route::get('users', function()
2 {
3 	$users = User::all();
4 
5 	return View::make('users')->with('users', $users);
6 });

เมทอด allที่ต่อจากเนมสเปซ User จะคิวรี่ค่าทั้งหมดจากตาราง users ส่วนใน View เราใช้ฟังก์ชัน with เพื่อดึงเฉพาะคอลัมน์ user ครับ

<a name="displaying-data"></a> ## Displaying Data

ตัวอย่างการแสดงค่าที่มาจากฐานข้อมูลบนไฟล์ view ครับ

1 @extends('layout')
2 
3 @section('content')
4 	@foreach($users as $user)
5 		<p>{{ $user->name }}</p>
6 	@endforeach
7 @stop

ต่อไปเราต้องไปเรียนรู้เรื่อง Eloquent และ Blade หรือแวะเข้าไปอ่านเล่นๆ ก่อนที่เรื่อง Queues และ Unit Testing .ถ้าต้องการใช้งานในระดับสูงต่อก็ไปที่ IoC Container

มาเจาะลึกผังการทำงานของ Laravel กันครับ

ตอนที่ 1 Autoloading

มีอยู่ด้วยกัน 4 ช่วง Autoloading,Bootstrap,Application,Run เริ่มที่ Autoloading ก่อนครับ

  1. เริ่มจากไฟล์ index.php ครับ ช่วงที่เราตั้งค่า vhost เราจะตั้งให้เส้นทางที่เข้าถึงเริ่มแรก คือ /public/ พอเริ่มเข้าถึงไฟล์ index.php ทำการเรียกไฟล์ autoload.php จากโฟลเดอร์ bootstrap
  2. ในไฟล์ autoload.php จะทำการตั้งค่าเวลาที่ตัวเว็บเริ่มทำงาน
  3. จากนั้นเราจะ เรียกไฟล์ autoload.php จากโฟลเดอร์ vendor ขึ้นมา
  4. ที่เห็นชื่อยาวขนาดนี้เป็นเพราะถูกสุมมาจากการที่ใช้คำสั่งartisan dump autoload เพื่อสร้าง รายชื่อของ package ใหม่นะครับ แต่ก่อนหน้านั้นเราจะทำการโหลดไฟล์ package ทั้งหมดก่อน โดยเรียกไฟล์ autoload_real.php ขึ้นมา
  5. ต่อมาใน ไฟล์ vendor/composer/autoload_real.php จะทำการเรียกไฟล์ Classloader มาทำการสร้างเป็นวัตถุชื่อ $loader แล้วก็
  6. เรียกไฟล์ autoload_classmap กับ autoload_namespaceขึ้นมาซึ่งในไฟล์ autoload_classmap จะเป็นรายชื่อของไฟล์ package ทั้งหมดที่อยู่ในโฟลเดอร์ vendor ส่วนในไฟล์ autoload_namespace จะเป็นรายชื่อของตัว namespace ที่ใช้เรียก root path ของไฟล์ package นั้นครับ
  7. พอเรียกเสร็จก็จะส่งกลับมาที่ ไฟล์ autoload แล้วก็ส่งค่าต่อไปให้ ClassLoader ของ laravel
  8. ตามลงมาดูว่า Classloaderของ laravel มันทำยังไงต่อนะครับ ฟังก์ชัน registerทำการเรียกใช้ ฟังก์ชัน load
  9. ฟังก์ชัน loadจะทำการเรียกโฟลเดอร์ package ที่มีตามรายชื่อในตัวแปร classที่ส่งมาตอนแรก
  10. เท่านี้ก็เสร็จการโหลด package ในโฟลเดอร์ vendor ครับ อะแต่ยังไม่หมดนะครับ ยังเหลือ package ที่โฟลเดอร์ workbench เรียกใช้คลาส Starterเพื่อทำการลงทะเบียน package ในโฟลเดอร์ workbench

โฟลเดอร์ workbech คือส่วนที่เราใช้ในการพัฒนา package ในเครื่องเราซึ่งยังไม่เสร็จหรือว่าทำขึ้นใช้เอง เราก็จะมาเริ่มต้นจากตรงนี้

package ถือว่าเป็นส่วนสำคัญที่จะต้องรู้ก่อนใน laravel 4 นี้เลย การเขียน package เป็นจะทำให้เราเลือก php libraly ตัวไหนก็ได้บน packagist.org ซึ่งเป็นศูนย์รวมของ libraly ของ php ที่ใช้มาตรฐาน psr-0,psr-1,psr-2 มาสร้างเป็น pakage ใช้เอง ซึ่งผมก็ได้ศึกษาแล้วลองทำไปเเล้วหลายตัวครับ ไว้จบเรื่องนี้ เเล้วจะมาขียนเรื่องการสร้าง package ต่อครับ

ปล.ตัวแปร Laravel_Start ตอนแรกเราสามารถนำไปใช้ ลบกับค่าเวลาปัจจุบันเพื่อหาเวลาที่เว็บใช้ จัดการคำร้องขอ


ตอนที่ 2 Application

  1. ขั้นตอนนี้จะเป็นการเริ่มสร้างตัวออปเจคหลักของ เว็บกันแล้วนะครับ เริ่มจากไฟล์ bootstrap/start.php เราจะดำดิ่งลงไปดูในคลาส ` Application ![](http://resource.thaicreate.com/upload/stock/20130718073801.png?v=1001) ตรงคลาสนี้เป็นตัวหลักที่คอยขับเคลื่อนเว็บไซต์ของเราเลยครับ เพราะ มีการเรียกใช้ คลาสเข้ามาจำนวนมาก ฟังก์ชันในนี้ ผมจะไม่พยายามไปดูให้ตาลาย ให้รู้ว่าเรา มีฟังก์ชันที่เราต้องเข้าใจ คือ App::share,App::bind,App::instance,App::make เราไปดูต่อว่าเริ่มมาตัว class Application`ทำอะไรต่อ
  2. เนื่องจาก ทำการเรียกตัวคลาสเข้ามาแล้ว จึงทำการสร้างวัตถุใหม่ได้ทันทีเลยครับ สิ่งที่ต้องสร้างก่อนสามอันดับแรกเลยก็คือ Class Exception ใช้ในการจัดการข้อผิดพลาด Class Routing จัดการๆวิ่งของคำร้องขอ Class Event จัดการเหตุการณ์ต่าง ที่เกิดขึ้น
  3. กลับมาที่ ไฟล์ start.php ครับ ขั้นต่อมา เราจะทำการตรวจสถานะการทำงานของระบบนะครับ ว่าอยู่ในโหมดไหน ตรงนี้มีประโยชน์มากในกรณีเมื่อเรากำลังพัฒนาอยู่ก็ตั้งให้เป็น development ส่วนจะไปกำหนดที่ไหนค่อยมาพูดกันอีกทีครับ
  4. ทำการโหลดไฟล์ path.php ซึ่งจะเป็น class ใช้ในการกำหนดเส้นทางการเข้าหาโฟลเดอร์ต่างๆ
  5. ทำการเรียกใช้งานตัว laravel ละครับตรงนี้จะเป็นการ เรียกไฟล์ start ของตัว laravel ขึ้นมา

ตอนที่ 3 Bootstrap

  1. laravel เริ่มการตรวจว่ามีการติตตั้ง Mcrypt ไหม
  2. ต่อมาก็ตรวจสภาวะการตั้งค่าก่อนว่าเรากำลัง ตั้งให้อยู่ในสถานะการทอบสอบไหม
  3. คลาส Facade จะทำการเคลียร์ ตัวแทนของมัน แล้วก็สร้างขึ้นใหม่
  4. ทำการโหลดข้อมูลการตั้งค่าจากตัวแปร $env ขึ้นมาใส่ให้คลาส Config ครับ แล้วสร้างตัวแทนให้คลาส Config
  5. ทำการตั้งค่าวันเวลาโดยโหลดค่ามาจากตัวแปรในไฟล์ app.php
  6. โหลดค่าชื่อย่อจากที่ไฟล์ app.php มา

มาให้ฟังก์ชัน getInstance มาทำการลงทะเบียนไว้

  1. ทำการอนุญาตให้ใช้คำร้องขอชนิด put ใช้ทำการแก้ไขข้อมูล กับ delete ใช้ในการลบข้อมูล เพื่อใช้ตอนทำ restful ในกรณีที่ firewall ไม่อนุญาตุให้เมทอดสองอันนี้ผ่าน เราจึงจำเป็นต้องทำการเปลี่ยนส่วนหัวของเมทอด post ให้กลายเป็นสองเมทอดที่โดนบล็อก
  2. ทำการวมคลาสทุกตัวที่โหลดมาเข้าด้วยกัน $config['providers'] คือรายชื่อคลาสที่อยู่ในไฟล์ app.php
  3. เรียกใช้ฟังก์ชัน $app->boot() เพื่อเริ่มต้นการทำงาน เเล้วเรียกไฟล์ global.php ซึ่งเป็นไฟล์ที่เราสามารถใช้กำหนดค่าเริ่มต้นเองได้
  4. รองสุดท้ายดึงไฟล์ที่เราใช้กำหนดสภาวะการตั้งค่าขึ้นมา
  5. สุดท้ายในบทนี้แล้วครับเรียกไฟล์ routes.php จบตอนครับ

ตอนที่ 4 Run

ตอนสุดท้ายแล้วครับ เราใกล้ได้คำตอบกลับหรือ Response

  1. ทำการเขียน session
  2. ค้นหา Route ที่ส่งมาว่าตรงกับตัวที่่กำหนดไว้ไหม
  3. สั่งให้ filter เช่น before,after ทำงาน
  4. สร้างคำตอบกลับหรือ Response
  5. ส่งคำตอบกลับ
  6. เรียกใช้ after filter อย่างเช่น log

จบแล้วครับกว่าจะได้คำตอบกลับหนึ่งครั้งยาวนานไหมครับ

ที่มา :: Kenny Mayer Per Your Request

การดึงค่าของการตั้งค่าหลักมาใช้

ส่วนการตั้งค่าหลักๆ ของเว็บเราจะอยู่ที่โฟลเดอร์ app/config ในบทนี้เราจะมาดูว่า laravel เตรียมฟังก์ชันอะไร ให้เราใช้ในการดึงค่าจากไฟล์ทั้งหลายในโฟลเดอร์ config ออกมาใช้ได้บ้าง.

laravel เตรียม class ที่ชื่อว่า Config ไว้ให้เราเเล้วนะครับ

ยกตัวอย่างการดึงค่า timezone ออกมา

1 Config::get('app.timezone');

เราสามารถกำหนดค่าของตัวแปรนั้นใหม่ได้ กรณีที่รูปแบบไม่เป็นไปตามที่เราต้องการ:

1 $timezone = Config::get('app.timezone', 'UTC');

สังเกตุว่าถ้าเป็นการเข้าถึงค่าในอาเรย์ของไฟล์ laravel จะใช้เครื่องหมายดอท ในการเข้าถึงนะครับ

กำหนดค่าแบบไม่ต้องเข้าไปในไฟล์เลย

1 Config::set('database.default', 'sqlite');

การกำหนดค่าแบบนี้จะไม่ไปเขียนทับการตั้งค่าในไฟล์ app.php นะครับ แต่จะเกิดผลเฉพาะตรงที่เราประกาศไว้เท่านั้น.

<a name="environment-configuration"></a> ## การกำหนดชุดรูปแบบของการตั้งค่าพื้นฐาน

ในการพัฒนาเว็บเรามักจะเปิด การตั้งค่าต่างๆเพื่อที่จะเอื้ออำนวยให้เราทราบข้อมูล ได้มากที่สุด แต่ในกรณีที่เว็บออนไลน์แล้วการแสดง การแสดงข้อมูลการทำงานผิดพลาด การลืมไปแล้วว่าเคยทิ้งคำสั่ง debug ไว้ตรงไหน

เริ่มต้นสร้างไฟล์ชุดการตั้งค่าในโฟลเดอร์ config ยกตัวอย่างชื่อ local.ยกตัวอย่างการตั้งค่าในไฟล์ สมมุติเราต้องการใช้แคชแบบ file ก็ทำแบบตัวอย่างเลยครับ

1 <?php
2 
3 return array(
4 
5 	'driver' => 'file',
6 
7 );

Note: testing เป็นชื่อที่ถูกกำหนด ไว้กับ laravel แล้วว่าถ้าอยู่ในชื่อนี้การตั้งค่าทั้งหมดจะอยู่ในการโหมด unit test ฉะนั้น เราอย่าไปตั้งทับมันเลยครับ

ส่วนการตั้งค่าที่เราไม่ได้ตั้งไว้ จะอ้างอิงกลับไปที่ไฟล์หลักนะครับ

ต่อมาเราต้องไปตั้งค่าให้ตัว laravel รู้ว่าขณะนี้อยู่ในโหมดไหน โดยเข้าไปตั้งค่าที่ bootstrap/start.php ตัวโฟลเดอร์จะอยู่ข้างหน้าสุดเลย. เข้าไปค้นหา $app->detectEnvironment ตัวฟังชันจะใช้ค้นหารูปแบบการตั้งค่าของเว็บเรา

1 <?php
2 
3 $env = $app->detectEnvironment(array(
4 
5     'local' => array('your-machine-name'),
6 
7 ));

เราก็จะเปลี่ยนให้้เป็นเหมือนตัวอย่าง

1 $env = $app->detectEnvironment(function()
2 {
3 	return $_SERVER['MY_LARAVEL_ENV'];
4 });

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

1 $environment = App::environment();

<a name="maintenance-mode"></a> ## การปรับปรุงเว็บไซต์

เมื่อเราต้องการปิดเว็บเพื่อทำการปรับปรุง เราจะกำหนดเมทอด App::down ไว้ที่ app/start/global.php ซึ่งจะทำให้ทุกคำร้องถูกพาไปที่หน้า ที่บอกว่าตอนนี้ เว้บกำลังอยู่ในสถานะปรับปรุง.

ต้องการทำให้รวดเร็วขึ้นก็ใช้ command line ก็ได้

1 php artisan down

up เป็นคำสั่งให้เว็บกลับไปอยู่ในสถานะออนไลน์อีกครั้ง

1 php artisan up

ถ้าต้องการเปลี่ยนหน้าที่ใช้ในการแสดงผลก็เข้าไปตั้งค่าที่ app/start/global.php ตัวอย่าง

1 App::down(function()
2 {
3 	return Response::view('maintenance', array(), 503);
4 });

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 });

การจัดการฐานข้อมูลเบื้องต้น

<a name="configuration"></a> ## การตั้งค่า

เราจะไปตั้งค่าที่ app/config/database.php. ซึ่งเราจะไปตั้งค่าการเชื่อมต่อข้างในนี้ครับ

laravel ในขณะนี้สนับสนุน: MySQL, Postgres, SQLite, and SQL Server.

<a name="read-write-connections"></a> ## การกำหนดว่าจะให้ database ตัวไหนอ่านหรือเขียน

ในตัวอย่างนี้ เราจะทำการโหลดบาลานซ์ โดยแบ่งให้ database ตัวหนึ่งทำหน้าที่อ่านข้อมูล และอีกตัวหนึ่งทำหน้าที่เขียนข้อมูลอย่างเดียว

 1 'mysql' => array(
 2 	'read' => array(
 3 		'host' => '192.168.1.1',
 4 	),
 5 	'write' => array(
 6 		'host' => '196.168.1.2'
 7 	),
 8 	'driver'    => 'mysql',
 9 	'database'  => 'database',
10 	'username'  => 'root',
11 	'password'  => '',
12 	'charset'   => 'utf8',
13 	'collation' => 'utf8_unicode_ci',
14 	'prefix'    => '',
15 ),

<a name="running-queries"></a> ## การทำ Queries

เราใช้คลาส DB ในการเรียกใช้การคิวรี่นะครับ

ตัวอย่างการคิวรี่

1 $results = DB::select('select * from users where id = ?', array(1));

ฟังก์ชันselectจะส่งค่าเป็น arrayกลับมาเสมอ <br /><br /> ตัวอย่างการเพิ่มข้อมูล

1 DB::insert('insert into users (id, name) values (?, ?)', array(1, 'Dayle'));

ตัวอย่างการแก้ไขข้อมูล

1 DB::update('update users set votes = 100 where name = ?', array('John'));

ตัวอย่างการลบข้อมูล

1 DB::delete('delete from users');

หมายเหตุ: คำสั่ง update กับ delete จะคืนค่าเป็นจำนวนของแถวที่ได้ทำการจัดการไป.

ตัวอย่างการใช้คำสั่งทั่วไป

1 DB::statement('drop table users');

เราสามารถกำหนดให้ฟังก์ชันนี้ทำงานเมื่อมีการคิวรี่เกิดขึ้นโดยใช้ฟังก์ชัน DB::listen

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

1 DB::listen(function($sql, $bindings, $time)
2 {
3 	//
4 });

<a name="database-transactions"></a> ## Database Transactions

เมื่อเราจะทำการคิวรี้หลายๆ คำสั่งเราจะใช้ฟังก์ชัน transaction ในการควบคุม เหมือนในตัวอย่างข้างล่าง

1 DB::transaction(function()
2 {
3 	DB::table('users')->update(array('votes' => 1));
4 
5 	DB::table('posts')->delete();
6 });

<a name="accessing-connections"></a> ## การเข้าถึงการเชื่อมต่อฐานข้อมูล

สมมุติเว็บของเราใช้ฐานข้อมูลหลายชนิด สามารถใช้ฟังก์ชัน DB::connection ในการเรียกฐานข้อมูล เฉพาะที่เราต้องการดังตัวอย่าง

1 $users = DB::connection('foo')->select(...);

แล้วก็สามารถเชื่อมต่อใหม่ด้วยคำสั่ง reconnect

1 DB::reconnect('foo');

<a name="query-logging"></a> ## การเก็บประวัติการคิวรี่

โดยค่าเริ่มต้น laravel จะเก็บประวัติไว้ในหน่วยความจำอยู่เเล้ว ในกรณีที่เว็บของเรามีคำร้องขอจำนวนมาก การเก็บประวัติจะใช้หน่วยความจำมาก เราจะใช้ฟังก์ชัน disableQueryLog เพื่อทำการหยุดเก็บประวัติ ตัวอย่าง

1 DB::connection()->disableQueryLog();

การแสดง query log

หลายครั้ง เราอยากรู้ว่า laravel กำลังใช้รันคิวรี้ตัวไหน ในครั้งล่าสุด เราสามารถใช้งาน

1 $queries = DB::getQueryLog();

เพื่อเรียกดูได้

Schema Builder ( คลาสเกี่ยวกับการสร้างตาราง )

คลาส Schemaใช้ในการจัดการตาราง มักใช้ร่วมกับคำสั่ง migration

<a name="creating-and-dropping-tables"></a> ## สร้างและลบตาราง

สร้างตารางใหม่ด้วยเมทอด Schema::create ตามตัวอย่างเลยครับ

1 Schema::create('users', function($table)
2 {
3 	$table->increments('id');
4 });

เมทอดตัวแรกคือชื่อตาราง พารามิเตอร์ที่สองคือ Closure ที่จะรับออปเจคของคลาส Blueprint ในการสร้างตาราง

จะเปลี่ยนชื่อตารางใช้เมทอดrename

1 Schema::rename($from, $to);

ในการเลือกการเชื่อมต่อกรณีเรามีหลายฐานข้อมูลใช้เมทอด Schema::connection

1 Schema::connection('foo')->create('users', function($table)
2 {
3 	$table->increments('id'):
4 });

จะลบตารางใช้เมทอด Schema::drop

1 Schema::drop('users');
2 
3 Schema::dropIfExists('users');

<br /><br /><br /><br /><br /><br /> <a name="adding-columns"></a> ## เพิ่มคอลัมน์

ในการแก้ไขตารางเราใช้คำสั่ง Schema::table

1 Schema::table('users', function($table)
2 {
3 	$table->string('email');
4 });

ตารางคำสั่งต่างของคลาส Blueprint ครับ

คำสั่ง | คำอธิบาย ————- | ————- $table->increments('id'); | ใช้ทำ auto_increment ให้ (primary key). $table->string('email'); | ค่าที่ออกมาจะเป็น VARCHAR ความยาว 255 $table->string('name', 100); | ค่าที่ออกมาจะเป็น VARCHAR ความยาว 100 $table->integer('votes'); | ค่าที่ออกมาจะเป็น interger $table->bigInteger('votes'); | ค่าที่ออกมาจะเป็น bigint $table->smallInteger('votes'); | ค่าที่ออกมาจะเป็นSMALLINT $table->float('amount'); | ค่าที่ออกมาจะเป็น FLOAT $table->decimal('amount', 5, 2); | ค่าที่ออกมาจะเป็น decimal ที่มีค่าระหว่าง 5,2 $table->boolean('confirmed'); | ค่าที่ออกมาจะเป็น BOOLEAN $table->date('created_at'); | ค่าที่ออกมาจะเป็น DATE $table->dateTime('created_at'); | ค่าที่ออกมาจะเป็นDATETIME $table->time('sunrise'); | ค่าที่ออกมาจะเป็น TIME $table->timestamp('added_on'); | ค่าที่ออกมาจะเป็น TIMESTAMP

<br /><br />

คำสั่ง | คำอธิบาย ————- | ————- $table->timestamps(); | เพิ่มคอลัมน์ created_at และ updated_at columns $table->softDeletes(); | เพิ่มคอลัมน์ deleted_at $table->text('description'); | ค่าที่ออกมาจะเป็น TEXT $table->binary('data'); | ค่าที่ออกมาจะเป็น BLOB $table->enum('choices', array('foo', 'bar')); | ค่าที่ออกมาจะเป็น ENUM ->nullable() | อนุญาตให้เป็นค่าว่างได้ ->default($value) | สร้างค่าเริ่มต้น ->unsigned() | เลี่ยน INTEGER เป็น UNSIGNED

ถ้าเราใช้ MySQL สามารถใช้เมทอด after ทำการเรียงลำดับคอลัมน์

ตัวอย่าง

1 $table->string('name')->after('email');

<a name="renaming-columns"></a> ## เปลี่ยนชื่อ Columns

ใช้เมทอด renameColumn ครับ

ตัวอย่าง

1 Schema::table('users', function($table)
2 {
3 	$table->renameColumn('from', 'to');
4 });

หมายเหตุ: คอลัมน์ชนิด enum ไม่สนับสนุน

<br /> <a name="dropping-columns"></a> ## ลบ Columns

ตัวอย่าง

1 Schema::table('users', function($table)
2 {
3 	$table->dropColumn('votes');
4 });

ลบหลายๆ คอลัมน์

1 Schema::table('users', function($table)
2 {
3 	$table->dropColumn('votes', 'avatar', 'location');
4 });

<a name="checking-existence"></a> ## ตรวจว่าตารางมีอยู่ไหม

ตรวจว่าตารางมีอยู่ไหม

1 if (Schema::hasTable('users'))
2 {
3 	//
4 }

ตรวจว่าคอลัมน์มีอยู่ไหม

1 if (Schema::hasColumn('users', 'email'))
2 {
3 	//
4 }

<br /><br /><br /><br /> <a name="adding-indexes"></a> ## เพิ่ม Indexes

สร้างทั้ง Column และ Index

1 $table->string('email')->unique();

คำสั่ง | คำอธิบาย ————- | ————- $table->primary('id'); | เพิ่ม primary key $table->primary(array('first', 'last')); | เพิ่ม composite keys $table->unique('email'); | เพิ่ม unique index $table->index('state'); | เพิ่ม basic index

<a name="foreign-keys"></a> ## Foreign Keys คีย์เชื่อม

ตัวอย่างการเพิ่มคีย์เชื่อม

1 $table->foreign('user_id')->references('id')->on('users');

ในตัวอย่างเราทำการให้คอลัมน์ user_idอ้างอิงกับคอลัมน์ id บนตารางusers

เราสามารถเสริมคำสั่ง “on delete” และ “on update” เข้าไปเหมือนตัวอย่าง

1 $table->foreign('user_id')
2       ->references('id')->on('users')
3       ->onDelete('cascade');

ในการลบใช้เมทอด dropForeign ตัวอย่าง

1 $table->dropForeign('posts_user_id_foreign');

หมายเหตุ: ให้ชนิดของคอลัมน์ที่เป็นคีย์เชื่อมให้เป็น unsigned ทุกครั้งกรณีที่เชื่อมไปยัง คอลัมน์ที่เป็น interger และเป็น auto_increment ครับ

<br /><br />

<a name="dropping-indexes"></a> ## ลบ Indexes

ในการลบคีย์เชื่อม larave ตั้งค่าคีย์เป็นค่าเริ่มต้นให้เเล้วนะครับ โดยอ้างอิงจากชนิดกับชื่อของตารง

คำสั่ง | คำอธิบาย ————- | ————- $table->dropPrimary('users_id_primary'); | ลบคีย์หลักจากตาราง users $table->dropUnique('users_email_unique'); | ลบคีย์เดี่ยวจากตาราง users $table->dropIndex('geo_state_index'); | ลบคีย์ทั่วไปจาก ตาราง geo <a name="storage-engines"></a> ##ชนิดของตาราง

การเซตชนิดของตารางเราใช้เมทอด engine ตามตัวอย่างครับ

1 Schema::create('users', function($table)
2 {
3     $table->engine = 'InnoDB';
4 
5     $table->string('email');
6 });

Query Builder ( ฟังก์ชันที่ใช้จัดการฐานข้อมูล )

คือการจัดการๆคิวรี่ของ laravel ช่วยอำนวยความสะดวกให้เรา ไม่ต้องเขียนคิวรี่ยาวๆ ด้วยตัวเองครับ <br /><br /> <a name="selects"></a> ## การเลือกข้อมูล

ดึงค่าทั้งหมดจากตาราง users

1 $users = DB::table('users')->get();
2 
3 foreach ($users as $user)
4 {
5 	var_dump($user->name);
6 }

<br /><br /> ดึงค่าแถวแรกจากตาราง users โดย name เท่ากับ john

1 $user = DB::table('users')->where('name', 'John')->first();
2 
3 var_dump($user->name);

<br /><br /> ดึงค่าจากตาราง users โดย name เท่ากับ john แล้วก็เอาแค่คอลัมน์ที่ชื่อว่า name

1 $name = DB::table('users')->where('name', 'John')->pluck('name');

<br /><br /> ดึงค่าทั้งหมดจากตาราง roles โดยเอาแค่คอลัมน์ title

1 $roles = DB::table('roles')->lists('title');

ค่าที่คืนมาจะเป็นอาเรย์นะครับ ถ้าเราอยากใส่คีย์ให้แต่ละแถวเราใส่พารามิเตอร์ตัวที่สองเข้าไป name จะไปเป็นคีย์ให้กับ title

1 $roles = DB::table('roles')->lists('title', 'name');

เมทอด select ใช้กำหนดคำสั่งในการเลือกเอง

1 $users = DB::table('users')->select('name', 'email')->get();
2 
3 $users = DB::table('users')->distinct()->get();
4 
5 $users = DB::table('users')->select('name as user_name')->get();

เลือกข้อมูลจากผลการคิวรี่อีกที

1 $query = DB::table('users')->select('name');
2 
3 $users = $query->addSelect('age')->get();

การใช้ where

1 $users = DB::table('users')->where('votes', '>', 100)->get();

การใช้หลายๆเงื่อนไขโดยวิธีเชนเมทอด

1 $users = DB::table('users')
2                     ->where('votes', '>', 100)
3                     ->orWhere('name', 'John')
4                     ->get();

ใช้ between

1 $users = DB::table('users')
2                     ->whereBetween('votes', array(1, 100))->get();

<br /><br /> ตัวอย่างการใช้ where กับ In ร่วมกัน

1 $users = DB::table('users')
2                     ->whereIn('id', array(1, 2, 3))->get();
3 
4 $users = DB::table('users')
5                     ->whereNotIn('id', array(1, 2, 3))->get();

ใช้หาแถวที่เป็นค่าวางตามคอลัมน์

1 $users = DB::table('users')
2                     ->whereNull('updated_at')->get();

ตัวอย่างการเรียงลำดับข้อมูล

1 $users = DB::table('users')
2                     ->orderBy('name', 'desc')
3                     ->groupBy('count')
4                     ->having('count', '>', 100)
5                     ->get();

การจำกัดข้อมูล

1 $users = DB::table('users')->skip(10)->take(5)->get();

<br /><br /><br /><br /> <a name="joins"></a> ## Joins

ตัวอย่างการ join ครับ

1 DB::table('users')
2             ->join('contacts', 'users.id', '=', 'contacts.user_id')
3             ->join('orders', 'users.id', '=', 'orders.user_id')
4             ->select('users.id', 'contacts.phone', 'orders.price');

การจอยแบบเติมคิวรี่ลงไปช่วยประหยัดเวลา เวลาคิดไม่ออกว่าจะใช้ฟังก์ไหนดี แทรกคิวรี่ลงไปตรงๆ เลย:

1 DB::table('users')
2         ->join('contacts', function($join)
3         {
4         	$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
5         })
6         ->get();

<a name="advanced-wheres"></a> ## Advanced Wheres

การ where แบบ หลายเงื่อนไข

1 DB::table('users')
2             ->where('name', '=', 'John')
3             ->orWhere(function($query)
4             {
5             	$query->where('votes', '>', 100)
6             	      ->where('title', '<>', 'Admin');
7             })
8             ->get();

หน้าตาของคิวรี่จะออกมาเป็นแบบนี้

1 select * from users where name = 'John' or (votes > 100 and title <> 'Admin')

หาว่ามีค่านี้อยู่ไหม

1 DB::table('users')
2             ->whereExists(function($query)
3             {
4             	$query->select(DB::raw(1))
5             	      ->from('orders')
6             	      ->whereRaw('orders.user_id = users.id');
7             })
8             ->get();

<br /><br /><br /><br /> หน้าตาของคิวรี่จะออกมาเป็นแบบนี้

1 select * from users
2 where exists (
3 	select 1 from orders where orders.user_id = users.id
4 )

<a name="aggregates"></a> ## Aggregates การหาผลรวมชนิดต่างๆ

ตัวอย่างการคำนวนค่า

1 $users = DB::table('users')->count();
2 
3 $price = DB::table('orders')->max('price');
4 
5 $price = DB::table('orders')->min('price');
6 
7 $price = DB::table('orders')->avg('price');
8 
9 $total = DB::table('users')->sum('votes');

<a name="raw-expressions"></a> ## Raw Expressions

Raw คือการใส่คิวรี่แบบสดๆ เข้าไปเลยไม่ต้องไปให้ฟังก์ชันสร้างให้ ประหยัดเวลามากขึ้นเมื่อเราต้องการค้นหาแบบซับซ้อน

ตัวอย่างการใช้คำสั่งคิวรี่

1 $users = DB::table('users')
2                      ->select(DB::raw('count(*) as user_count, status'))
3                      ->where('status', '<>', 1)
4                      ->groupBy('status')
5                      ->get();

<br /><br /><br /><br /> การเพิ่มและลดค่าให้คอลัมน์

1 DB::table('users')->increment('votes');
2 
3 DB::table('users')->increment('votes', 5);
4 
5 DB::table('users')->decrement('votes');
6 
7 DB::table('users')->decrement('votes', 5);

การกำหนดค่าคอลัมน์ที่จะเพิ่มค่าให้

1 DB::table('users')->increment('votes', 1, array('name' => 'John'));

<a name="inserts"></a> ## การเพิ่มข้อมูล

ตัวอย่าง

1 DB::table('users')->insert(
2 	array('email' => 'john@example.com', 'votes' => 0)
3 );

การเพิ่มค่าพร้อมกับเพิ่มค่า id ด้วย

1 $id = DB::table('users')->insertGetId(
2 	array('email' => 'john@example.com', 'votes' => 0)
3 );

หมายเหตุ: ถ้าใช้ PostgreSQL เมทอด insertGetId คาดหวังว่าจะใช้คอลัมน์ “id” เป็นตัวที่มันจะเพิ่มให้

การเพิ่มหลายๆข้อมูล

1 DB::table('users')->insert(array(
2 	array('email' => 'taylor@example.com', 'votes' => 0),
3 	array('email' => 'dayle@example.com', 'votes' => 0),
4 ));

<br /><br /><br /><br /> <a name="updates"></a> ## การแก้ไข

ตัวอย่าง

1 DB::table('users')
2             ->where('id', 1)
3             ->update(array('votes' => 1));

<a name="deletes"></a> ## การลบ

ตัวอย่าง

1 DB::table('users')->where('votes', '<', 100)->delete();

การลบข้อมูลทั้งหมดเป็นการลบแบบแถวต่อแถว

1 DB::table('users')->delete();

การลบแบบลบทั้งตารางด้วยแล้วสร้างขึ้นใหม่

1 DB::table('users')->truncate();

<a name="unions"></a> ## การทำ Unions

union คือการจับผลลัพท์ของการ selecet 2 ครั้ง มารวมกันเป็นหนึ่งผลลัพท์ การทำ union ใน querie

1 $first = DB::table('users')->whereNull('first_name');
2 
3 $users = DB::table('users')->whereNull('last_name')->union($first)->get();

มีเมทอด unionAll ใช้งานเหมือนกับ union เลยครับ <br /><br /><br /><br /> <a name="pessimistic-locking"></a> ## การยึดทรัพยากรเพื่อใช้งาน

ใน 4.1 นี้ได้เพิ่ม เมทอด sharedLock เพื่อช่วยในการทำ transaction

1 DB::table('users')->where('votes', '>', 100)->sharedLock()->get();

เมทอด lockForUpdate ใช้ในการยึดข้อมูลที่ จะทำการแแก้ไขจนกว่าจะเสร็จครับ

1 DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();

<a name="caching-queries"></a> ## Caching Queries

เราสามารถทำการแคชหรือบันทึกผลการคิวรี่ไว้บน session ก่อนด้วยเมทอด remember

ตัวอย่าง

1 $users = DB::table('users')->remember(10)->get();

ในตัวอย่างเราจะแคชผลการค้นหานี้เป็นเวลา 10 นาที ระหว่างนี้การคิวรี่จากตัวอย่างจะไม่ไปดึงข้อมูลจากฐานข้อมูล แต่จะดึงจากแคชจนกว่าจะหมดเวลาครับ

Eloquent ORM

<a name="introduction"></a> ## ทำความรู้จักก่อน

Eloquent ORM คือการที่เราจำลองตารางเป็นคลาสแล้ว เรียกใช้งานเป็นชื่อของตาราง นั้นเลยทำให้เข้าใจการพัฒนารวดเร็วขึ้น เข้าใจง่ายขึ้น ที่เรียกว่า Eloquent เพราะตัวมันมีความเรียบง่าย สามารถเข้าใจว่าจะใช้ได้ยังไงทันที ถ้าเคยเขียน php แบบ oop มาก่อน

<a name="basic-usage"></a> ## การใช้งานเบื้องต้น

เริ่มต้นด้วยการสร้าง moedel ไว้ที่โฟลเดอร์ app/models

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

1 class User extends Eloquent {}

ถ้าคลาสนี้จะไม่ใช้ตารางตามชื่อ model เราก็สามารถใช้ตัวแปร table ในการกำหนดชื่อตารางที่เราจะใช้ เหมือนในตัวอย่าง

1 class User extends Eloquent {
2 
3 	protected $table = 'my_users';
4 
5 }

หมายเหตุ: Eloquent จะถือว่าคอลัมน์ id เป็นคีย์หลักเสมอ เราสามารถใช้ตัวแปร primaryKey เพื่อกำหนดคีย์หลักได้เอง และเช่นเดียวกัน เราสามารถใช้ตัวแปร connectionเพื่อกำหนดฐานข้อมูลที่เราจะใช้ใน model นี้

ถ้าในตารางของเรามีคอลัมน์ที่ชื่อ updated_at กับ created_at จะถูกใช้ในการเก็บเวลาที่ข้อมูลในแถวนี้ถูกเพิ่มหรือแก้ไข. ถ้าเราไม่ต้องการเพียงแค่ตั้งค่าตัวแปร $timestamps ให้เป็น false

การคิวรี่โดยใช้ eoloquent

ค้นหาข้อมูลทั้งหมดจากตาราง user

1 $users = User::all(); //

ค้นหาตามเงื่อนไข

ค้นหาโดยค่า id เท่ากับ 1

1 $user = User::find(1); //

แสดงค่าในคอลัมน์ออกมา

1 var_dump($user->name); // 

Note: ทุกคำสั่งที่ใช้ใน query builder สามารถใช้กับ eloquent ได้เช่นกัน

การคิวรี่แล้วส่งต่อ

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

1 $model = User::findOrFail(1);
2 
3 $model = User::where('votes', '>', 100)->firstOrFail();

อยากจะสร้างการแสดงข้อผิดพลาดโดยที่เรากำหนดเองก็สามารถทำตามตัวอย่างเลยครับ สมมุติเราจะสร้างฟังก์ชัน ModelNotFoundExceptionเราก็เรียกตัวคลาสหลักเข้ามาก่อน

1 use Illuminate\Database\Eloquent\ModelNotFoundException;
2 
3 App::error(function(ModelNotFoundException $e)
4 {
5 	return Response::make('Not Found', 404);
6 });

ตัวอย่างการคิวรี่แบบหลายเงื่อนไข

1 $users = User::where('votes', '>', 100)->take(10)->get();
2 
3 foreach ($users as $user)
4 {
5 	var_dump($user->name);
6 }

** การคำนวนแบบต่างๆ **

1 $count = User::where('votes', '>', 100)->count();

ถ้าเราอยากเขียนคำสั่งคิวรี่ ขึ้นมาใช้เองก็ต้องใช้ฟังก์ชัน whereRaw

1 $users = User::whereRaw('age > ? and votes = 100', array(25))->get();

<a name="mass-assignment"></a> ## การส่งค่าอาเรย์ลงฐานข้อมูล

เราสามารถส่ง ค่าจำนวนมากอย่างเช่น อาเรย์ ลงฐานข้อมูลได้ง่ายๆ แต่ต้องใช้ตัวแปร<br /> fillable เพื่อกำหนดว่าคอลัมน์ไหนที่สามารถใส่อาเรย์ได้ <br /> guarded เพื่อกำหนดว่าคอลัมน์ไหนใส่อาเรย์ลงไปไม่ได้

ตัวอย่างการกำหนดค่า fillable

1 class User extends Eloquent {
2 
3 	protected $fillable = array('first_name', 'last_name', 'email');
4 
5 }

ตัวอย่างการตั้งค่าตัวแปร guard

1 class User extends Eloquent {
2 
3 	protected $guarded = array('id', 'password');
4 
5 }

ต้วอย่างคอลัมน์ id and password เราจะไม่อนุญาติให้ทำการใส่ค่าที่มาในรูปแบบอาเรย์ลงไป

การป้องกันไม่ให้ทำการเพิ่มข้อมูลเป็นอาเรย์

1 protected $guarded = array('*');

<br /><br /><br /><br /><br /><br /> #### การเพิ่มข้อมูลพร้อมตรวจสอบ

สร้าง user ใหม่

1 $user = User::create(array('name' => 'John'));

รับค่ามาใส่ตามคอลัมน์ จะอัพเดทถ้ามีค่าอยู่แล้ว ถ้าไม่มีจะสร้างใหม่

1 $user = User::firstOrCreate(array('name' => 'John'));

ตรวจสอบว่ามีค่าไหม.

1 $user = User::firstOrNew(array('name' => 'John'));

<a name="insert-update-delete"></a> ## เพิ่ม, ลบ, แก้ไข

ตัวอย่างการแก้ไขข้อมูลแบบไม่ใช้ namespace

1 $user = new User;
2 
3 $user->name = 'John';
4 
5 $user->save();

หมายเหตุ: โดยเริ่มต้น laravel จะทำการเพิ่มค่าคีย์หลักให้อัตโนมัติ ถ้าเราไม่ต้องการก็ตั้งค่าตัวแปร incrementingใน model ให้เป็น false.

เราสามารถใช้คำสั่ง create เพื่อสร้างข้อมูลใหม่ได้ แต่ก่อนหน้านั้นต้องกำหนดตัวแปร fillable หรือ guarded ไม่งั้นเพิ่มไม่ได้ติด error

การสร้างข้อมูลใหม่

1 $user = User::create(array('name' => 'John'));

<br /><br /><br /><br /> ตัวอย่างการแก้ไขข้อมูล

1 $user = User::find(1);
2 
3 $user->email = 'john@foo.com';
4 
5 $user->save();

บางเวลาเราต้องบันทึกค่าในตารางที่อ้างอิงกัน เราจะใช้คำสั่ง push

บันทึกค่าพร้อมกับบันทึกลงตารางที่มีการเชื่อมกันอยู่

1 $user->push();

ตัวอย่างการลบข้อมูล

1 $user = User::find(1);
2 
3 $user->delete();

ลบโดยกำหนด id เป็นเงื่อนไข

1 User::destroy(1);
2 
3 User::destroy(1, 2, 3);

ตัวอย่างการลบแบบมีเงื่อนไข:

1 $affectedRows = User::where('votes', '>', 100)->delete();

ถ้าเราต้องการแก้ไขเฉพาะคอลัมน์ที่ใช้บันทึกเวลา เราจะใช้คำสั่ง touch

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

1 $user->touch();

<br /><br /> <a name="soft-deleting"></a> ## การกำหนดว่าข้อมูลนี้ถูกลบเเล้ว เราสร้างตัวแปร $softdelete เพื่อบอก model ว่าไม่ต้องลบจริง เหมือนกับเราเอาไปเก็บไว้ในถังขยะก่อน ยังไม่ได้เอาไปเผาทิ้งจริงๆ

1 class User extends Eloquent {
2 
3 	protected $softDelete = true;
4 
5 }

แล้วก็เพิ่มคอลัมน์ deleted_at ลงในตาราง เพื่อกำหนดว่าข้อมูลแถวนี้ถูกลบแล้วหรือยัง

เมื่อเราเรียกคำสั่ง delete กับ model นี้คอลัมน์ deleted_at จะถูกเพิ่มค่าให้เป็นวันเวลาที่เราลบ เมื่อเราค้นหาข้อมูลโดยใช้ model นี้ข้อมูลแถวที่เราทำการ ลบจะไม่ถูกดึงขึ้นมา

ตัวอย่างการค้นหา โดยรวมแถวที่ถูกตั้งค่าว่าลบแล้ว

1 $users = User::withTrashed()->where('account_id', 1)->get();

ตัวอย่างการค้นหา โดยค้นหาเฉพาะแถวที่ถูกตั้งค่าว่าลบแล้ว

1 $users = User::onlyTrashed()->where('account_id', 1)->get();

ถ้าต้องการยกเลิกการลบ ใช้คำสั่ง restore ได้เลยครับ

1 $user->restore();

หรือจะเรียกคืนเฉพาะแถวก็ตามตัวอย่างนี้เลย

1 User::withTrashed()->where('account_id', 1)->restore();

ฟังก์ชัน restore สามารถใช้กับความสัมพันธ์ได้ด้วย

1 $user->posts()->restore();

ถ้าต้องการลบข้อมูลจริงๆ ก็ใช้คำสั่ง forceDelete

1 $user->forceDelete();

คำสัง forceDelete ก็สามารถใช้กับความสัมพันธ์ก็ได้

1 $user->posts()->forceDelete();

ฟังก์ชัน trashed ใช้ในการตรวจว่าโมเดลนี้มีการตั้งค่า softdelete ไว้ไหม

1 if ($user->trashed())
2 {
3 	//
4 }

<a name="timestamps"></a> ## Timestamps การบันทึกเวลา

โดยค่าเริ่มต้น laravel ใช้คอลัมน์ created_at และ updated_at ในตารางของเราโดยอัตโนมัติ.

ตัวอย่างการยกเลิกการเก็บเวลาในการจัดการข้อมูล

1 class User extends Eloquent {
2 
3 	protected $table = 'users';
4 
5 	public $timestamps = false;
6 
7 }

ฟังก์ชัน freshTimestampใช้ในการกำหนดรูปแบบวันเวลาที่เราจะเก็บ

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

1 class User extends Eloquent {
2 
3 	public function freshTimestamp()
4 	{
5 		return time();
6 	}
7 
8 }

<br /><br /> <a name="query-scopes"></a> ## Query Scopes

เราใช้คำนำหน้าฟังก์ชันว่า scope เพื่อทำการสร้างฟังก์ชันที่ใช้คิวรี่แบบเฉพาะของเราเอง:

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

1 class User extends Eloquent {
2 
3 	public function scopePopular($query)
4 	{
5 		return $query->where('votes', '>', 100);
6 	}
7 
8 }

การใช้งานคิวรี่ที่มาจาการใช้คำสั่ง scope

1 $users = User::popular()->orderBy('created_at')->get();

<a name="relationships"></a> ## ความสัมพันธ์

การจัดการความสัมพันธ์ตารางใน laravel มี 4 รูปแบบ

  • 1 ต่อ 1
  • 1 ต่อ กลุ่ม
  • กลุ่ม ต่อ กลุ่ม
  • ความสัมพันธ์แบบซับซ้อน

<br /><br /><br /><br /><br /><br /><br /> <a name="one-to-one"></a> ### 1 ต่อ 1

ตัวอย่างความสัมพันธ์แบบ 1 ต่อ 1 ผู้ใช้งานมีโทรศัพท์ได้เเค่เครื่องเดียว

ตัวอย่างความสัมพันธ์แบบ 1 ต่อ 1

1 class User extends Eloquent {
2 
3 	public function phone()
4 	{
5 		return $this->hasOne('Phone');
6 	}
7 
8 }

เราใช้ฟังก์ชันเป็นตัวกำหนดตารางที่เราจะเชื่อมด้วย ตัวอย่างข้างล่างการค้นหาโทรศัพท์ของผู้ใช้งานที่มี id เท่ากับ 1

1 $phone = User::find(1)->phone;

ถ้าเขียนเป็น php ธรรมดาก็จะได้เเบบนี้ครับ

1 select * from users where id = 1
2 
3 select * from phones where user_id = 1

โดยค่าเริ่มต้นเเล้ว Eloquent จะใช้คอลัมน์ user_id ในตาราง Phone เป็น คีย์เชื่อม ถ้าเราไม่เอา จะเอาชื่อที่เราตั้งเองก็ใช้ตัวแปร hasOne เป็นตัวแก้ดังตัวอย่าง

1 return $this->hasOne('Phone', 'custom_key');

ในการเชื่อมโมเดลสิ่งที่สำคัญคือการตั้งค่าความสัมพันธ์ให้ตรงกันใน Phone model เราก็จะใช้ฟังก์ชัน belongsTo ในการเชื่อมกลับไปยัง User

ตัวอย่างการเชื่อมกลับไปยัง User Model

1 class Phone extends Eloquent {
2 
3 	public function user()
4 	{
5 		return $this->belongsTo('User');
6 	}
7 
8 }

เหมือนกับข้างบนครับ เราไม่เอา user_id เป็นคีย์เชื่อมก็ต้องกำหนดด้วย ตามตัวอย่าง

1 class Phone extends Eloquent {
2 
3 	public function user()
4 	{
5 		return $this->belongsTo('User', 'custom_key');
6 	}
7 
8 }

<a name="one-to-many"></a> ### 1 ต่อ กลุ่ม

ความสัมพันธ์แบบ 1 ต่อ กลุ่ม มีตัวอย่างคือ 1 โพสมีได้หลาย ความคิดเห็น ตัวอย่างการใช้ hasMany

1 class Post extends Eloquent {
2 
3 	public function comments()
4 	{
5 		return $this->hasMany('Comment');
6 	}
7 
8 }

ตัวอย่างการค้นหาตารางที่เชื่อมกันอยู่

1 $comments = Post::find(1)->comments;

ตัวอย่างการค้นหาแบบหลายเงื่อนไขครับ ดังตัวอย่าง เราจะค้นหาความคิดเห็นที่มี title ชื่อ foo โดยเอาค่าเเรกที่เจอก่อน

1 $comments = Post::find(1)->comments()->where('title', '=', 'foo')->first();

อีกครั้ง อย่าลืมเชื่อมกลับไปยังตารางที่เชื่อมมานะครับ

<br /><br /><br /><br /> ดูตัวอย่างอีกครั้ง

1 class Comment extends Eloquent {
2 
3 	public function post()
4 	{
5 		return $this->belongsTo('Post');
6 	}
7 
8 }

<a name="many-to-many"></a> ### กลุ่ม ต่อ กลุ่ม

กลุ่มต่อกลุ่ม จะเป็นความสัมพันธ์ที่ยุ่งยากพอสมควรเลยครับ เรามีตัวอย่างคือ ผู้ใช้งานมีสิทธิการใช้งานได้หลายสิทธิ์ ทั้งเรียกดู,ลบ,แก้ไข,เพิ่ม แล้วแต่ละสิทธิ์ก็ถูกใช้ได้ในหลายผู้ใช้งาน เราต้องมี 3 ตาราง users, roles, กับ role_user. ตาราง role_userจะเก็บ user_id กับ role_id เพื่อบอกว่า ผู้ใช้งานคนนี้มีสิทธิทำอะไรได้บ้าง

laravel ใช้ฟังก์ชัน belongsToMany ในการเชื่อมความสัมพันธ์:

1 class User extends Eloquent {
2 
3 	public function roles()
4 	{
5 		return $this->belongsToMany('Role');
6 	}
7 
8 }

ตอนนี้เราสามารถตรวจได้เเล้วว่าผู้ใช้งานหมายเลข 1 มีสิทธิทำอะไรได้บ้าง

1 $roles = User::find(1)->roles;

ถ้าเราต้องการใช้ชื่อตาราง ตามใจเราก็สามารถทำได้โดยการ ส่งพารามิเตอร์ไป ดังตัวอย่างครับ

1 return $this->belongsToMany('Role', 'userroles');

หรือจะเปลี่ยนไปจนถึงชื่อคอลัมน์เลยก็ได้ แต่ต้องส่งชื่อ คอลัมน์ที่เราตั้งเองไปบอก model ด้วย

1 return $this->belongsToMany('Role', 'userroles', 'user_id', 'foo_id');

อย่าลืมเชื่อมความสัมพันธ์กลับมาด้วยนะครับ

1 class Role extends Eloquent {
2 
3 	public function users()
4 	{
5 		return $this->belongsToMany('User');
6 	}
7 
8 }

<br /><br /> <a name="polymorphic-relations"></a> ### ความสัมพันธ์ที่ยุ่งยากมากขึ้น เพื่อช่วยให้เข้าใจได้ง่ายขึ้นจะมีตัวอย่างมาให้ดูกันครับ ตัวอย่างโครงสร้างตาราง

 1 staff
 2 	id - integer
 3 	name - string
 4 
 5 orders
 6 	id - integer
 7 	price - integer
 8 
 9 photos
10 	id - integer
11 	path - string
12 	imageable_id - integer
13 	imageable_type - string

มันพิเศษตรงที่คอลัมน์ imageable_id กับ imageable_type ของตาราง photos ที่เราจะใช้เก็บคีย์ที่ใช้เชื่อมตาราง photo เข้ากับตาราง staff หรือ order ใช้เก็บคีย์เชื่อมร่วมกันได้ โดยใช้คอลัมน์ เมื่อเรากำหนดคีย์เชื่อมและชื่อของตารางที่เชื่อมไป ORM จะทำการตรวจสอบโดยใช้คอลัมน์ที่ imageable_type ในการหาว่าคีย์นี้เป็นของตารางไหน โดยเราต้องตั้งชื่อฟังก์ชันว่า imageable เราต้องประกาศ model แบบนี้ครับ <br /><br /><br /><br /><br /><br />

1 class Photo extends Eloquent {
2 
3 	public function imageable()
4 	{
5 		return $this->morphTo();
6 	}
7 
8 }

ฟ class Staff extends Eloquent {

 1 	public function photos()
 2 	{
 3 		return $this->morphMany('Photo', 'imageable');
 4 	}
 5 
 6 }
 7 
 8 class Order extends Eloquent {
 9 
10 	public function photos()
11 	{
12 		return $this->morphMany('Photo', 'imageable');
13 	}
14 
15 }

ตอนนี้เราสามารถใช้ id ของ staff หรือ order มาค้นหารูปภาพได้ <br /><br /> ตัวอย่าง

1 $staff = Staff::find(1);
2 
3 foreach ($staff->photos as $photo)
4 {
5 	//
6 }

ความพิเศษจริง ๆอยู่ที่เมื่อเราใช้ Photo model ในการค้นครับ

ตัวอย่าง

1 $photo = Photo::find(1);
2 
3 $imageable = $photo->imageable;

ความสัมพันธ์ที่ชื่อ imageable บน model Photo จะส่งข้อมูลของทั้ง Staff และ Order หรือตารางใดตารางหนึ่ง ขึ้นอยู่กับค่าที่เราใช้ค้นหาจะไปตรงกับ model ไหน

<a name="many-to-many-polymorphic-relations"></a> ### การใช้ความสัมพันธ์แบบซับซ้อนในแบบ many to many

โมเดล Post และ โมเดล Video ต่างมีความสัมพันธ์แบบ many to many กับโมเดล Tag มาดูโครงสร้างตารางเพื่อความเข้าใจง่ายกันดีกว่าครับ

 1 posts
 2 	id - integer
 3 	name - string
 4 
 5 videos
 6 	id - integer
 7 	name - string
 8 
 9 tags
10 	id - integer
11 	name - string
12 
13 taggables
14 	tag_id - integer
15 	taggable_id - integer
16 	taggable_type - string

ต่อไปเรามาตั้งค่าความสัมพันธ์ให้โมเดลกันครับ โมเดล Post และ Video จะใช้ความสัมพันธ์แบบ morphToMany กับโมเดล tags

1 class Post extends Eloquent {
2 
3 	public function tags()
4 	{
5 		return $this->morphToMany('Tag', 'taggable');
6 	}
7 
8 }

ในโมเดล Tag เราจะเชื่อมกับโมเดลทั้งสอง โดยใช้ morphByMany ผ่านทางตาราง taggable ความเรียบง่ายของ laravel ทำให้ความสัมพันธ์ ที่แสนจะน่าปวดหัวง่ายขึ้น

 1 class Tag extends Eloquent {
 2 
 3 	public function posts()
 4 	{
 5 		return $this->morphedByMany('Post', 'taggable');
 6 	}
 7 
 8 	public function videos()
 9 	{
10 		return $this->morphedByMany('Video', 'taggable');
11 	}
12 
13 }

ปล. การเรียกใช้ก็เหมือนกับ morphMany ด้านบนเลยครับ

<a name="querying-relations"></a> ## การคิวรี่โดยใช้ความสัมพันธ์เป็นเงื่อนไข

เราสามารถจำกัดผลการค้นหาด้วยฟังก์ชัน has

ค้นหาโดยจำกัดเฉพาะความสัมพันธ์

1 $posts = Post::has('comments')->get(); 

เลือกข้อมูลของตาราง post โดยเอาเฉพาะที่มี comment

1 $posts = Post::has('comments', '>=', 3)->get(); 

เลือก post ที่มี comment มากกว่าหรือเท่ากับ 3 <br /><br /><br /><br /><br /><br /><br /><br /> <a name="dynamic-properties"></a> ### การค้นหาแบบยืดหยุ่น

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

 1 class Phone extends Eloquent {
 2 
 3 	public function user()
 4 	{
 5 		return $this->belongsTo('User');
 6 	}
 7 
 8 }
 9 
10 $phone = Phone::find(1);

แทนที่เราจะทำแบบข้างบน ซึ่งจะทำให้เราได้ค่าที่ไม่ต้องการออกมามาก เราก็เปลี่ยนมาใช้แบบข้างล่าง เราสามารถเข้าถึง อีเมล์ ของผู้ใช้งาน คนแรกได้เลย

1 echo $phone->user()->first()->email;

หรือจะให้สั้นได้อีก ก็ทำตามนี้เลยครับ

1 echo $phone->user->email;

<a name="eager-loading"></a> ## Eager Loading

Eager loading มีเพื่อแก้ปัญหาการคิวรี่แบบ N + 1 ตัวอย่างคือ, ผู้เเต่งหนึ่งคนสามารถแต่งหนังสือได้หลายๆ เล่ม ความสัมพันธ์จะออกมาแบบนี้

1 class Book extends Eloquent {
2 
3 	public function author()
4 	{
5 		return $this->belongsTo('Author');
6 	}
7 
8 }

แล้วการคิวรี้ที่มีปัญหาก็ประมาณนี้

1 foreach (Book::all() as $book)
2 {
3 	echo $book->author->name;
4 }

1 คิวรี้ จะทำการดึงค่าหนังสือทั้งหมดจากตาราง, แล้วการคิวรี่ครั้งต่อไปก็จะทำเหมือนกัน. ถ้ามีหนังสือ 25 เล่ม,จะมีการคิวรี่ถึง 26 ครั้ง คือเราใช้ข้อมูลทั้งหมดของตารางหนังสือไปค้นหาผูแต่ง 1 ผู้แต่งก็จะไปดึงหนังสือทั้งหมดของเขาออกมา

1 select * from books
2 
3 select * from authors where id = ?

นึกถึงเรามีข้อมูลเริ่มต้น 1000 แถว ปัญหานี้ส่วนใหญ่จะเกิดขึ้นกับความสัมพันธ์แบบ hasMany เพราะเราต้องนำทั้งหมดไปค้นหาต่อแล้วแต่ละแถวจะได้ผลลัพท์ออกมาหลายๆ แถวจำนวนผลการค้นหาที่มหาศาลจะทำให้การคิวรี่ช้ามากแต่ ซึงถ้าข้อมูลตั้งต้นยังมากกว่านี้ลงไปแต่งคิวรี่เองโดยใช้ Fluent Query Builder แต่ถ้ายังจะใช้ Eloquent ก็ยัง โชคดีที่ laravel มีฟังก์ชัน with ใช้ในการทำให้เร็วขึ้น

1 foreach (Book::with('author')->get() as $book)
2 {
3 	echo $book->author->name;
4 }

sql ที่เกิดขึ้นจะมีหน้าตาแบบนี้ครับ เริ่มจากค้นหาหนังสือทั้หมดก่อนแล้ว ค่อยเอา id ที่ได้ไปค้นต่อในตาราง authors เราเปลี่ยนไปใช้ in แทน

1 select * from books
2 
3 select * from authors where id in (1, 2, 3, 4, 5, ...)

จะทำให้เว็บของเราโหลดเร็วขึ้นอย่างมากเลยครับ

ตัวอย่าง การใช้ eager loading ในกรณีตารางมีการเชื่อมกับอีกหลายตาราง

1 $books = Book::with('author', 'publisher')->get();

จะใช้การทำ eager load กับคอลัมน์อื่นได้

1 $books = Book::with('author.contacts')->get();

In the example above, the author relationship will be eager loaded, and the author’s contacts relation will also be loaded.

Eager Load Constraints

บางเวลาเราต้องการเฉพาะบางคอลัม์จาการทำ eager loading แล้วใส่เงื่อนไขเข้าไปอีก สามารถกำหนดได้ดัังนี้ครับ:

1 $users = User::with(array('posts' => function($query)
2 {
3 	$query->where('title', 'like', '%first%');
4 }))->get();

Lazy Eager Loading

เราสามารถใช้การทำ eager loading ไปยังตารางที่เชื่อมกันได้เหมือนในตัวอย่างครับ เราเข้าไปค้นต่อไปในตาราง publisher ที่เชื่อมกับตาราง author อีก

1 $books = Book::all();
2 
3 $books->load('author', 'publisher');

<a name="inserting-related-models"></a> ## การบันทึกข้อมูลแบบมีความสัมพันธ์

สมมุตอเราจะเพิ่มความคิดเห็นลงบทความนี้แล้วเราก็ต้องนำ id ของบทความที่เราโพสความคิดเห็นใส่ไปมาใส่ในความคิดเห็นด้วย

ตัวอย่างการเก็บข้อมูลที่ต้องมีความสัมพันธ์

1 $comment = new Comment(array('message' => 'A new comment.'));
2 
3 $post = Post::find(1);
4 
5 $comment = $post->comments()->save($comment);

ในตัวอย่างคอลัมน์post_id จะถูกใส่ค่าให้อัติโนมัติ <br /><br /> ### การจัดการฟอเรี้ยนคีย์

เมื่อเราจะทำการแก้ไขข้อมูลที่มีความสัมพันธ์แบบ กลุ่มต่อหนึ่ง เราต้องใช้ฟังก์ชัน associate ในการเพิ่มค่าคีย์เชื่อมไปยังตารางที่มีความสัมพันธ์อยู่ด้วย

1 $account = Account::find(10);
2 
3 $user->account()->associate($account);
4 
5 $user->save();

การเพิมข้อมูลแบบกลุ่มต่อกลุ่ม (Many To Many)

ตัวอย่างคือเราจะทำการเพิ่มความสามารถให้ผู้เราต้อง laravel มีฟังก์ชัน attach มาให้ใช้เเล้ว

การเพิ่มข้อมูลแบบกลุ่มต่อกลุ่ม

1 $user = User::find(1);
2 
3 $user->roles()->attach(1);

ตัวอย่างข้างล่าง เราจะทำการเพิ่มข้อมูลไปยังตารางที่ใช้เชื่อม สามารถส่งเป็นอาเรย์ก็ได้:

1 $user->roles()->attach(1, array('expires' => $expires));

เมื่อเพิ่มแล้วก็ลบได้ ฟังก์ชัน detach ใช้ลบค่าในตารางที่ใช้เชื่อม

1 $user->roles()->detach(1);

เราสามารถใช้ฟังก์ชัน syncเมทอด เพื่อการเพิ่มค่าไปยังตารางที่เชื่อมอยู่ด้วยได้ ในขณะที่เพิ่มลงในตารางหลัก

ตัวอย่างการใช้ sync กับความสัมพันธ์แบบกลุ่มต่อกลุ่ม

1 $user->roles()->sync(array(1, 2, 3));

Aตัวอย่างการใช้ sync กับตารางกลาง

1 $user->roles()->sync(array(1 => array('expires' => true)));

การใช้เมทอด save เพื่อทำการเพิ่มข้อมูลงตารางที่เชื่อมกันอยู่

1 $role = new Role(array('name' => 'Editor'));
2 
3 User::find(1)->roles()->save($role);

ในตัวอย่างเราสร้าง Role model แล้วแนบไปกับ User model. แล้วยังสามารถแนบอาเรย์เข้าไปได้อีก

1 User::find(1)->roles()->save($role, array('expires' => $expires));

<a name="touching-parent-timestamps"></a> ## การแก้ไขคอลัมน์ที่เก็บเวลาในตารางที้่่เชื่อมด้วย

ตัวอย่าง เมื่อเราแก้ไขข้อมูลในตาราง Comment เราต้องการแก้ไขข้อมูลในตาราง Post ในแถวที่เชื่อมกันด้วย laravel เตรียมฟังก์ชัน touch มาให้เเล้ว วิธีการใช้งานในตัวอย่างเลยครับ

 1 class Comment extends Eloquent {
 2 
 3 	protected $touches = array('post');
 4 
 5 	public function post()
 6 	{
 7 		return $this->belongsTo('Post');
 8 	}
 9 
10 }

ตอนนี้ถ้าเราทำการแก้ไขข้อมูลในตาราง Comment, คอลัมน์ updated_at ข้อมูลในตาราง Postที่เชื่อมด้วยก็จะถูกแก้ไขด้วย

<a name="working-with-pivot-table"></a> ## การจัดการตารางที่ใช้เชื่อม

laravel เตรียมฟังก์ชัน pivot มาให้เราใช้ในการจัดการข้อมูลของตารางที่ใช้เชื่อมตรงกลางระหว่างสองตาราง ดังตัวอย่างเลยครับ

1 $user = User::find(1);
2 
3 foreach ($user->roles as $role)
4 {
5 	echo $role->pivot->created_at;
6 }

คลาส Role model จะดึงค่าออกมาจากตารางกลาง โดยใช้ฟังก์ชันpivot โดยอัติโนมัติ

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

1 return $this->belongsToMany('Role')->withPivot('foo', 'bar');

ตอนนี้ตัวแปร foo กับ bar จะถูกใช้กับฟังก์ชัน pivot ในการจัดการตาราง Role

และถ้าเราต้องการ คอลัมน์ created_at กับ updated_at เพื่อใช้กำหนดเวลา laravel มีฟังก์ชัน withTimestamps ซึ่งเราต้องกำหนดตอนประกาศความสัมพันธ์ครับ

1 return $this->belongsToMany('Role')->withTimestamps();

ต่อมาถ้าเราต้องการลบข้อมูลในตารางในตารางกลาง เพื่อความถูกต้องของข้อมูลเราจะใช้ฟังก์ชัน detachนะครับ

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

1 User::find(1)->roles()->detach();

เราจะทำการแก้ไขไม่ให้ผู้ใช้งานหมายเลข 1 มีสิทธิในการทำอะไรเลย

<a name="has-many-through"></a> ### Has Many Through

ใช้อำนวยความสะดวก ในการเข้าถึงโมเดลที่มีความสัมพันธ์กัน แต่ต้องเรียกผ่านโมเดลอีกหลายตัว ยกตัวอย่าง โมเดล Country มีความสัมพันธ์แบบ one to many กับโมเดล Posts เช่เดียวกับโมเดล Users โครงสร้างตารางของทั้งสามโมเดลจะเป็นแบบนี้

 1 countries
 2 	id - integer
 3 	name - string
 4 
 5 users
 6 	id - integer
 7 	country_id - integer
 8 	name - string
 9 
10 posts
11 	id - integer
12 	user_id - integer
13 	title - string

<br /><br /><br /> จะเห็นว่าตาราง posts จะไม่ได้เก็บ country_id ด้วยความสามารถของความสัมพันธ์แบบ hasManyThrough จะทำการเชื่อมต่อ อัติโนมัติให้ทำ เราสามารถเรียก ใช้งานโมเดล post ได้ โดยการประกาศ ฟังก์ชันดังตัวอย่าง

1 class Country extends Eloquent {
2 
3 	public function posts()
4 	{
5 		return $this->hasManyThrough('Post', 'User');
6 	}
7 
8 }

ตัวอย่างนี้ก็เป็นการอนุญาตให้เรา กำหนดฟอเรี้ยนคีย์ได้

1 class Country extends Eloquent {
2 
3 	public function posts()
4 	{
5 		return $this->hasManyThrough('Post', 'User', 'country_id', 'user_id');
6 	}
7 
8 }

<a name="collections"></a> ## Collections

ข้อมูลที่เป็นผลลัพท์ของการค้นหานั้นจะกลับออกมาเป็น อาเรย์ eloquent อำนวนความสะดวกให้เราโดยมีฟังกชัน contains ให้ในการตรวจสอบข้อมูล

ตรวจว่าในผลลัพท์ที่ได้มามีข้อมูลที่มีคีย์หลัก เป็น 2 ไหม

1 $roles = User::find(1)->roles;
2 
3 if ($roles->contains(2))
4 {
5 	//
6 }

เพื่อความสบายของเรายิ่งขึ้นไปอีกเมื่อค้นเสร็จก็เอาเฉพาะค่า role แปลงเป็นอาเรย์ หรือ json เสร็จสรรพเลย

1 $roles = User::find(1)->roles->toArray();
2 
3 $roles = User::find(1)->roles->toJson();

แทนที่จะใช้การทำ foreach แบบปกติเหมือนเดิม eloquent มีฟังก์ชัน each กับ filter มาให้ <br /><br /> การใช้งาน each และ filter

1 $roles = $user->roles->each(function($role)
2        {
3 
4        });
5 
6 $roles = $user->roles->filter(function($role){});

เพิ่มการ Callback

1 $roles = User::find(1)->roles;
2 
3 $roles->each(function($role)
4 {
5 	//
6 });

เรียงลำดับค่าที่อยู่ในอาเรย์ด้วยฟังก์ชัน sortby

1 $roles = $roles->sortBy(function($role)
2 {
3 	return $role->created_at;
4 });

บางครั้งเราต้องการเปลียนแปลงค่าทั้งออปเจคเลย eloquent ก็มีฟังก์ชัน newCollection ให้ใช้ในการเขียนทับ

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

1 class User extends Eloquent {
2 
3 	public function newCollection(array $models = array())
4 	{
5 		return new CustomCollection($models);
6 	}
7 
8 }

<br /><br /> <a name="accessors-and-mutators"></a> ## Accessors & Mutators

บางเวลาเราต้องการ จัดรูปแบบข้อมูลให้อยู่ในรูปแบบที่เราต้องการ ก่อนจะบันทึกหรือดึงมาใช้ eloquent เตรียมฟังก์ชัน getFooAttribute แต่การตั้งชื่อฟังก์ชันคำเริ่มต้นของคำที่เป็นชื่อของคอลัมน์ ต้องขึ้นต้นด้วยตัวพิมพ์ใหญ่ ในกรณีที่มีเครื่องหมาย _ มาคั่น คำหลังจากนั้นก็ต้องขึ้นต้นด้วยตัวพิมพ์ใหญ่ครับ

ตัวอย่าง

1 class User extends Eloquent {
2 
3 	public function getFirstNameAttribute($value)
4 	{
5 		return ucfirst($value);
6 	}
7 
8 }

ในตัวอย่างเราทำการสร้าง accessor ของคอลัมน์ first_name ทีนี้ค่าที่เราส่งเข้าฟังก์ชันนี้ก็จะถูกส่งไปเก็บถูกที่ละครับ

การสร้างฟังก์ชัน Mutator ก็คล้ายๆ กัน

ตัวอย่าง

1 class User extends Eloquent {
2 
3 	public function setFirstNameAttribute($value)
4 	{
5 		$this->attributes['first_name'] = strtolower($value);
6 	}
7 
8 }

<br /><br /><br /><br /><br /> <a name="date-mutators"></a> ## Date Mutators

โดยค่าเริ่มต้นเเล้ว Eloquent จะทำการตั้งค่าให้คอลัมน์ created_at, updated_at, และ deleted_at ตามค่าเบื้องต้นของ php.ini อยู่เเล้วนะครับ

แต่ถ้าเราต้องการแก้ไขหรือเรียกใช้งานแบบไม่อยากเข้าไปยุ่งตรงๆ ก็สามารถใช้ฟังก์ชัน getDates แบบในตัวอย่างเลยครับ

1 public function getDates()
2 {
3 	return array('created_at');
4 }

ข้างในเราสามารถจัดการก่อนเอาไปใช้ได้เลย และ laravel ก็มีคลาสจัดการ วันเวลาที่มีฟังก์ชันหลากหลายมากอย่าง Carbon มาให้ใช้ด้วย แต่ต้องไปประกาศชื่อย่อในไฟล์ app.php ก่อนนะครับ โดยค่าเริ่มต้นเเล้วไม่มี

<a name="model-events"></a> ## Model Events

Eloquent เตรียมฟังก์ชันที่คอยดักจับเหตุการณ์ต่างๆ มาให้เราดังนี้ครับ creating, created, updating, updated, saving, saved, deleting, deleted. แต่ถ้าค่าที่ส่งกลับมาเป็น false เหตุการณ์ creating, updating, หรือ saving จะถูกยกเลิก

การยกเลิกการแก้ไขข้อมูล

1 User::creating(function($user)
2 {
3 	if ( ! $user->isValid()) return false;
4 });

การที่เราจะสร้างฟังก์ชัน์ในการจัดการเหตุการณ์ของ model ต้องประกาศฟังชัน boot ก่อนนะครับ

การประกาศฟังก์ชัน boot

 1 class User extends Eloquent {
 2 
 3 	public static function boot()
 4 	{
 5 		parent::boot();
 6 
 7 		// Setup event bindings...
 8 	}
 9 
10 }

<a name="model-observers"></a> ## Model Observers

Eloquent มีคลาสชื่อ Observer ในการสร้างฟังก์ชันที่ใช้จัดการเหตุการณ์ ฟังก์ชันcreating, updating, saving ก็ตั้งตามเหตุการณ์ที่จะให้ฟังก์ชันนั้นจัดการครับ ตัวอย่าง

 1 class UserObserver {
 2 
 3 	public function saving($model)
 4 	{
 5 		//
 6 	}
 7 
 8 	public function saved($model)
 9 	{
10 		//
11 	}
12 
13 }

แล้วเราก็ต้องประกาศโดยใช้ฟังชัน observe แบบตัวอย่าง

1 User::observe(new UserObserver);

<a name="converting-to-arrays-or-json"></a> ## การแปลงค่าเป็น Arrays หรือ JSON

การแปลงผลลัพทที่ค้นมาให้กลายเป็น array

1 $user = User::with('roles')->first();
2 
3 return $user->toArray();
4 
5 return User::all()->toArray();

การแปลงผลลัพธ์ให้กลายเป็น json

1 return User::find(1)->toJson();

<br /><br /><br /> การใช้งาน Eloquent จากใน route เลย

1 Route::get('users', function()
2 {
3 	return User::all();
4 });

บางเวลาาเราไม่อยากให้บางคอลัมน์ถุกเรียกไปพร้อมกับ toJson หรือ toArray เราก็ใช้ตัวแปร hidden ในการนั้น

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

1 class User extends Eloquent {
2 
3 	protected $hidden = array('password');
4 
5 }

Forms & HTML

เป็นคลาสที่ใช้จัดการ Form กับ html

<a name="opening-a-form"></a> ## การเปิดฟอร์ม

ตัวอย่าง

1 {{ Form::open(array('url' => 'foo/bar')) }}
2 	//
3 {{ Form::close() }}

โดยค่าเริ่มต้นชนิดของคำร้องขอจะเป็น POST ถ้าจะเปลี่ยนก็เเค่ใส่พารามิเตอร์ไปเหมือนในตัวอย่างครับ

1 echo Form::open(array('url' => 'foo/bar', 'method' => 'put'))

สามารถกำหนดเป้าหมายของไฟล์ที่จะส่งค่าไปได้หลายรูปแบบตามตัวอย่างเลยครับ

1 echo Form::open(array('route' => 'route.name'))
2 
3 echo Form::open(array('action' => 'Controller@method'))

จะกำหนดพารามิเตอร์โดยเฉพาะเลยก็ตามตัวอย่างครับ:

1 echo Form::open(array('route' => array('route.name', $user->id)))
2 
3 echo Form::open(array('action' => array('Controller@method', $user->id)))

ถ้าจะสร้างฟอร์มมาอัพโหลดไฟล์ก็ต้องตั้งค่าแบบตัวอย่างครับ files

1 echo Form::open(array('url' => 'foo/bar', 'files' => true))

<a name="csrf-protection"></a> ## การป้องกัน CSRF

Laravel เตรียมการป้องกันโดยสร้างค่า hash ขึ้นจาก session ของ user แล้วสร้าง hidden form ขึ้นมาใส่ไว้ เราเพียงแต่ใช้เมทอด tokenประกาศไว้ก็เสร็จเเล้วครับ

ตัวอย่าง

1 echo Form::token();

การป้องกัน csrf จากใน route

1 Route::post('profile', array('before' => 'csrf', function()
2 {
3 	//
4 }));

<a name="form-model-binding"></a> ## การดึงค่าจากตารางมาใส่ในฟอร์ม

laravel เตรียมเมทอด Form::model มาเพื่อการนั้นครับ

ตัวอย่าง

1 echo Form::model($user, array('route' => array('user.update', $user->id)))

ถ้าชื่อของคอลัมน์ตรงกับ ชื่อของฟอร์มค่าก็จะปรากฏมาโดยอัติโนมัติ อย่างเช่นฟอร์มชื่อ email,ตรงกับโมเดลชื่อ email แต่ค่าที่จะปรากฏบนฟอร์มไม่ได้มีแค่ค่าที่มาจากโมเดลอย่างเดียว มีจาก session ค่าที่มาจากการส่งพารามิเตอร์อีก ลำดับการแสดงค่าจึงตามข้างล่างนี้ครับ 1. ค่าจาก Session (ค่าเก่าที่เกิดจาการป้อน) 2. ค่าจากการส่งพารามิเตอรื 3. ค่าจากโมเดล

ซึ่งเมื่อ server ส่งค่าการตรวจสอบค่าที่ป้อนมาว่าผิดพลาด ค่าที่ส่งมาจากโมเดลก็จะตามกลับขึ้นมาด้วย

หมายเหตุ: เมือใช้ Form::modelอย่าลืม Form::close!

<a name="labels"></a> ## การใส่ป้ายชื่อ

การใส่ป้ายชื่อให้ฟอร์ม

1 echo Form::label('email', 'E-Mail Address');

การใส่คลาสให้ฟอร์ม

1 echo Form::label('email', 'E-Mail Address', array('class' => 'awesome'));

หมายเหตุ: หลังจากใส่ค่า label ชื่อฟอร์ม ค่า id ก็จะตั้งตามค่า label โดยอัติโนมัติ.

<a name="text"></a> ## Text, Text Area, Password & Hidden Fields

ตัวอย่างฟอร์มที่ใช้รับค่า

1 echo Form::text('username');

กำหนดค่าเริ่มต้นให้ฟอร์ม

1 echo Form::text('email', 'example@gmail.com');

หมายเหตุ: hidden และ textarea ฟังก์ชันใช้งานเหมือน text เมทอด

สร้างฟอร์มรับรหัสผ่าน

1 echo Form::password('password');

สร้างฟอร์มชนิดอื่น

1 echo Form::email($name, $value = null, $attributes = array());
2 echo Form::file($name, $attributes = array());

<a name="checkboxes-and-radio-buttons"></a> ## Checkboxes and Radio Buttons

สร้างฟอร์มชนิดเลือกค่า

1 echo Form::checkbox('name', 'value');
2 
3 echo Form::radio('name', 'value');

สร้างฟอร์มชนิดเลือกค่าโดยค่าเริ่มต้นคือเลือกไว้เเล้ว

1 echo Form::checkbox('name', 'value', true);
2 
3 echo Form::radio('name', 'value', true);

<a name="file-input"></a> ## File Input

สร้างฟอร์มอัพโหลดไฟล์

1 echo Form::file('image');

<a name="drop-down-lists"></a> ## Drop-Down Lists

สร้างฟอร์มให้เลือกค่าแบบดรอบดาวน์

1 echo Form::select('size', array('L' => 'Large', 'S' => 'Small'));

สร้างฟอร์มชนิดเลือกค่าแบบดรอบดาวน์โดยค่าเริ่มต้นคือเลือกไว้เเล้ว

1 echo Form::select('size', array('L' => 'Large', 'S' => 'Small'), 'S');

แบ่งกลุ่มให้ตัวเลือก

1 echo Form::select('animal', array(
2 	'Cats' => array('leopard' => 'Leopard'),
3 	'Dogs' => array('spaniel' => 'Spaniel'),
4 ));

สร้างดรอปดาวน์แบบช่วง

1 echo Form::selectRange('number', 10, 20);

สร้างดรอปดาวน์แบบเดือน

1 echo Form::selectMonth('month')

<br /><br /><br /><br /><br /> <a name="buttons"></a> ## Buttons

สร้างปุ่มส่งค่า

1 echo Form::submit('Click Me!');

หมายเหตุ: ถ้าจะสร้างปุ่มธรรมดาก็ใช้ button

<a name="custom-macros"></a> ## Custom Macros

macro คือชุดของ html ที่เราเขียนเตรียมไว้ สามารถนำเอาไปแทรกตามใจเราได้

การสร้าง Form Macro

1 Form::macro('myField', function()
2 {
3 	return '<input type="awesome">';
4 });

เรียก Form Macro มาใช้

1 echo Form::myField();

<a name="views"></a> # Views

Views คือส่วนที่ใช้เก็บไฟล์ที่ใช้สร้างหน้า html นะครับจะถูกเก็บไว้ที่โฟลเดอร์ app/views ตัวอย่าง view

1 <!-- View stored in app/views/greeting.php -->
2 
3 <html>
4 	<body>
5 		<h1>Hello, <?php echo $name; ?></h1>
6 	</body>
7 </html>

การใช้งาน view เบื้องต้นครับ

1 Route::get('/', function()
2 {
3 	return View::make('greeting', array('name' => 'Taylor'));
4 });

ส่งค่าไปที่ view ครับ

1 $view = View::make('greeting', $data);
2 
3 $view = View::make('greeting')->with('name', 'Steve');

ในตัวอย่างตัวแปร $nameจะถูกใช้งานบน View ได้

You may also share a piece of data across all views:

1 View::share('name', 'Steve');

<br /><br /><br /><br /> การส่ง view แทรกเข้าไปในอีก view หนึ่งครับ

เราสร้างโฟลเดอร์ขึ้นมาเก็บ view ที่เราจะทำเป็น view ย่อยก่อนตัวอย่าง app/views/child/view.php ตัวอย่างการใช้งาน

1 $view = View::make('greeting')->nest('child', 'child.view');
2 
3 $view = View::make('greeting')->nest('child', 'child.view', $data);

ผลที่ออกมาครับ

1 <html>
2 	<body>
3 		<h1>Hello!</h1>
4 		<?php echo $child; ?>
5 	</body>
6 </html>

<a name="view-composers"></a> ## View Composers

View composers คือเมทอดที่ช่วยเราในการจัดการค่าที่เราต้องแสดง ในทุกหน้าของ view ลดการเขียนโค้ดซ้ำซ้อน

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

1 View::composer('profile', function($view)
2 {
3 	$view->with('count', User::count());
4 });

ตอนนี้ทุกครั้งที่ profile view ถูกสร้าง count จะถูกส่งขึ้นไปด้วย

เราสามารถส่งขึ้นไปทีละหลายๆ view ได้

1 View::composer(array('profile','dashboard'), function($view)
2 {
3     $view->with('count', User::count());
4 });

<br /><br /><br />

ถ้าเราต้องการทำให้เป็นคลาสเพื่อง่ายต่อการจัดกลุ่ม เราต้องทำแบบนี้ครับ

1 View::composer('profile', 'ProfileComposer');

สร้างคลาสขึ้นมา

1 class ProfileComposer {
2 
3 	public function compose($view)
4 	{
5 		$view->with('count', User::count());
6 	}
7 
8 }

แล้วอย่าลืมเพิ่มเข้าไปที่ไฟล์ composer.json

IoC Container

<a name="introduction"></a> ## Introduction >หมายเหตุ :: ถ้าใครยังไม่ค่อยเข้าใจว่าสองตัวนี้มันคืออะไรลองไปอ่านที่ผมสรุปไว้ที่นี้ก่อนครับ

IOC คือคลาสที่ใช้ในการจัดการ library ภายนอกที่เรานำเข้ามาใช้ หรือที่ดึงเข้ามาใช้โดย composer ต่อไปนี้จะเรียกย่อๆว่า IOC นะครับ IOC จะช่วยในการเรียกใช้งานคลาสต่าง การทำความเข้าใจ IOC ถือว่าเป็นหัวใจ เลยในการปูทางสู่การทำเว็บขนาดใหญ่สำหรับ laravel นะครับ เพราะหลักการนี้จะเกี่ยวโยงไปถึงเรื่อง Service Provider กับ Facade

<a name="basic-usage"></a> ## การใช้งานเบื้องต้น

การใช้งาน IOC ในการผูก object

1 App::bind('foo', function($app)
2 {
3 	return new FooBar; //
4 });

ง่ายคือต่อไปนี้พารามิเตอร์ชื่อ foo จะใช้เป็นตัวแทนของ class FooBar ที่ถูกสร้างเป็นวัตถุแแล้ว

การเรียกใช้งาน

1 $value = App::make('foo');

เมื่อเราเรียกใช้งาน App::make เมทอด ฟังก์ชันข้างบนก็จะถูกเรียกใช้งาน ตัวแปร value ก็จะรับคุณสมบัติต่างๆ ของคลาส FooBar เข้ามา

บางครั้งเราไม่ต้องการสร้าง instane ทุกครั้งที่รีเฟรช laravel มีฟังก์ชัน singleton มาให้ใช้ในการนี้เลยครับ <br /><br /><br /><br /><br /><br /> ตัวอย่างการใช้งาน

1 App::singleton('foo', function()
2 {
3 	return new FooBar;
4 });

ถ้าไม่ต้องการจัดเพิ่มเข้าไปทั้งคลาสจะยัดเข้าไปเป็นออปเจ็คก็ใช้ฟังก์ชัน instance ได้เลยครับ

ตัวอย่างการผูกออปเจคเข้าไป

1 $foo = new Foo;
2 
3 App::instance('foo', $foo);

<br /><br /><br /> <a name="automatic-resolution"></a> ## Automatic Resolution

ตัวอย่างการผูกคลาสอย่างรวดเร็วขึ้นโดยไม่ต้องใช้ App::bind แล้วแต่ขอให้ชื่อตรงกันก็พอ

ตัวอย่าง

 1 class FooBar {
 2 
 3 	public function __construct(Google $baz)
 4 	{
 5 		$this->baz = $baz;
 6 	}
 7 
 8 }
 9 
10 $fooBar = App::make('FooBar');

ในตัวอย่างนี้ ตัวแปร $foofBar จะเก็บค่าคลาส Google ที่ถูกแทรกเข้ามา

laravel จะทำการเรียกใช้ reflection class ของ php เพื่อทำการตรวจสอบค่าต่างๆ ในคลาสนั้นให้เองครับ
บางกรณีคลาสที่เราจะใช้งานดันไปดึงคลาสที่เป็น interface เข้ามาใช้ด้วย เพื่อการนั้นเราต้องใช้ App::bind เมทอด ในการผูก ดังตัวอย่าง

ตัวอย่างการผูก class ที่เป็นเรียกใช้งาน interface

1 App::bind('UserRepositoryInterface', 'DbUserRepository');

คลาสที่เราเรียกใช้งาน

1 class UserController extends BaseController {
2 
3 	public function __construct(UserRepositoryInterface $users)
4 	{
5 		$this->users = $users;
6 	}
7 
8 }

ตอนนี้ UserRepositoryInterface จะถูกเรียกใช้งานแล้ว <a name="practical-usage"></a> ## การประยุกต์ใช้งาน

เพื่อความยืดหยุ่นในการทดสอบและใช้งาน Laravel เตรียมการให้เราใช้งาน IOC ไในหลายกรณีเลยครับ

ตัวอย่างการเรียกใช้งาน Class OrderRepository

 1 class OrderController extends BaseController {
 2 
 3 	public function __construct(OrderRepository $orders)
 4 	{
 5 		$this->orders = $orders;
 6 	}
 7 
 8 	public function getIndex()
 9 	{
10 		$all = $this->orders->all();
11 
12 		return View::make('orders', compact('all'));
13 	}
14 
15 }

ในตัวอย่างคลาส OrderRepository แทรกเข้าไปโดยอัติโนมัติเมื่อ คลาส OrderController ทำงาน เมื่อมีการทำ unit testing คลาส OrderRepository ก็จะถูกเพิ่มเข้ามาเหมือนกัน

Filters, composers และ event handlers อยู่นอกเหนือการทำงานของ IoC container เมื่อเราจะใช้ต้องทำตามตัวอย่างครับ

การใช้งาน View::composer,Route::filter และ Event::listen กับ IOC

1 Route::filter('foo', 'FooFilter');
2 
3 View::composer('foo', 'FooComposer');
4 
5 Event::listen('foo', 'FooHandler');

<a name="service-providers"></a> ## Service Providers

Service providers เป็นการจับคลาส IOC ที่ทำงานคล้ายกันเข้ามาไว้ในที่เดียวกัน. แล้วเรียกใช้งาน ด้วย facade โดยหลักเเล้วทุกคลาสหลักของ laravel ใช้การทำ service provider ในการจัดการเราสามารถเข้าไปดูได้ตรงที่ตัวแปรอาเรย์ providers ตรงที่app/config/app.php

จะสร้าง Service Provider ขึ้นมาใช้กับคลาสของเราเริ่มแรกต้องดึงคลาส Illuminate\Support\ServiceProvider และประกาศเมทอด register

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

 1 use Illuminate\Support\ServiceProvider;
 2 
 3 class FooServiceProvider extends ServiceProvider {
 4 
 5 	public function register()
 6 	{
 7 		$this->app->bind('foo', function()
 8 		{
 9 			return new Foo;
10 		});
11 	}
12 
13 }

ในเมทอด register คลาส IOC จะเป็นตัวแปร $this->app ถ้าเราทำเสร็จแล้วก็ต้องเอาเส้นทางที่อยู่ของคลาส Provider ของเราไปเพิ่มในอาเรย์ providers ใน app.php ด้วย

การเรียกใช้งาน Service Provider ด้วยเมทอด App::register <br /><br /><br /><br /> ตัวอย่าง

1 App::register('FooServiceProvider');

<a name="container-events"></a> ## Container Events

ใน IOC ก็มี event อยู่ชื่อเมทอดว่า resolving

การใช้งาน resoliving เพื่อรอดูว่ามี IOC ตัวไหนทำงานบ้าง

1 App::resolving(function($object)
2 {
3 	//
4 });

Mail ( การส่งเมล์ )

<a name="configuration"></a> ## การตั้งค่า

Laravel นำไลบราลี่ SwiftMailer มาใช้งาน การตั้งค่าอยู่ที่ app/config/mail.php,โดยจะให้เราเปลี่ยน SMTP host, port, และ username กับ password, แล้วก็ค่า from คือค่าเริ่มต้นของชื่อผู้รับ. ถ้าเราต้องการใช้ไลบรารี php mail ในการส่งก็เพียงเปลี่ยน driver เป็น mail

<a name="basic-usage"></a> ## การใช้งานเบื้องต้น

ฟังก์ชัน Mail::send ใช้ในการส่งอีเมล์

1 Mail::send('emails.welcome', $data, function($message)
2 {
3 	$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
4 });

เมทอด send ตัวแปรแรกคือไฟล์ html ที่เป็นรูปแบบข้อมความในเมล์. ตัวที่สองคือข้อมูลที่จะเขียนลงเมล์ $data ซึ่งจะถูกส่งไปยัง view ตัวที่สามเป็นฟังก์ชันที่ใช้กำหนดค่าต่างๆของอีเมล์

Note: ตัวแปร $message คือออปเจ็คของตัว Swiftmailer class ซึ่งเราจะใช้กำหนดค่าต่างๆของเมล์

1 Mail::send(array('html.view', 'text.view'), $data, $callback);

ตัวอย่างคือเราเลือกที่จะส่งไปในรูปแบบใด html หรือ text

1 Mail::send(array('text' => 'view'), $data, $callback);

ตัวอย่างการปรับแต่งเนื้อหาภายในเมล์:

1 Mail::send('emails.welcome', $data, function($message)
2 {
3 	$message->from('us@example.com', 'Laravel');
4 
5 	$message->to('foo@example.com')->cc('bar@example.com');
6 
7 	$message->attach($pathToFile);
8 });

เมื่อจะทำการแนบไฟล์เราต้องใส่นามสกุลกับชื่อให้มันด้วย:

1 $message->attach($pathToFile, array('as' => $display, 'mime' => $mime));

<a name="embedding-inline-attachments"></a> ## การแทรกไฟล์ไว้ระหว่างบรรทัด

เราสามารถแนบรูปไปโดยไม่ให้เเสดงได้โดยใช้ฟังก์ชัน embed

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

1 <body>
2 	Here is an image:
3 
4 	<img src="<?php echo $message->embed($pathToFile); ?>">
5 </body>

<br /><br /><br /> <a name="queueing-mail"></a> ## เรียงลำดับการส่งอีเมล์

ในการส่งอีเมล์จำนวนมากนั้นเรา ต้องทำการเรียงลำดับการส่ง เพื่อการนั้น laravel เตรียมคลาส Queue มาให้เราใช้ในการเรียงลำดับการส่งอีเมล์แล้วครับ

ตัวอย่าง

1 Mail::queue('emails.welcome', $data, function($message)
2 {
3 	$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
4 });

เราสามารถหน่วงเวลาการส่งโดยใช้ฟังก์ชัน later ตามตัวอย่างครับ

1 Mail::later(5, 'emails.welcome', $data, function($message)
2 {
3 	$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
4 });

ถ้าเรามีหลายคิว มีฟังก์ชันให้เราเรียงคิวอีก คือ queueOn และ laterOn

1 Mail::queueOn('queue-name', 'emails.welcome', $data, function($message)
2 {
3 	$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
4 });

<a name="mail-and-local-development"></a> ## Mail & Local Development

ในการพัฒนานั้น เรายังไม่ต้องใช้งานเมล์จริงๆในการส่งก็ได้ laravel เตรียมฟังก์ชัน Mail::pretend หรือตั้งค่า pretend ใน app/config/mail.php เป็น true. เพื่อเข้าสู่ pretend mode ข้อความบนเมล์ที่ถูกส่งจะถูกเขียนบนล็อกแทย

Session ( คลาสที่ใช้จัดกาาร Session )

<a name="configuration"></a> ## การตั้งค่าเบื้องต้น

ไฟล์ที่ใช้ตั้งค่าจะอยู่ที่ app/config/session.php.โดยชนิดของ session จะมีหลายชนิดนะครับแต่โดยเริ่มต้นแล้วจะเป็น native ส่วนการตั้งค่าอื่นๆ ก็จะเป็นเวลาที่จะให้ seesion มีชีวิตอยู่ ที่อยู่ของ seesion ชื่อของ cookie และอื่นๆ ครับ

<a name="session-usage"></a> ##การใช้งาน

การสร้างค่าแล้วเก็บใน session

1 Session::put('key', 'value');

ดึงค่าจาก Session

1 $value = Session::get('key');

ดึงค่าเริ่มต้นของ session

1 $value = Session::get('key', 'default');
2 
3 $value = Session::get('key', function() { return 'default'; });

ตรวจว่ามีค่านี้ใน Session หรือไม่

1 if (Session::has('users'))
2 {
3 	//
4 }

ลบค่าออกจาก Session

1 Session::forget('key');

ลบค่าทั้งหมด Session

1 Session::flush();

สร้าง Session ID อีกครั้ง

1 Session::regenerate();

<a name="flash-data"></a> ## Flash Data

หลายๆครั้งเราต้องฝากค่าไว้ใน session เพื่อนำไปใช้ในการทำงานต่อไป สามารถใช้เมทอด Session::flash ตัวอย่าง

1 Session::flash('key', 'value');

ทำการเรียกใช้ falsh message อีกครั้ง

1 Session::reflash();

ทำการเรียกใช้งานอีกครั้งเฉพาะค่า

1 Session::keep(array('username', 'email'));

<a name="database-sessions"></a> ## การเก็บ session ในฐานข้อมูล

เมื่อเราใช้ฐานข้อมูลเก็บ session เราต้องสร้างตารางขึ้นมาก่อน ด้วยคำสั่งSchema ดังตัวอย่าง

1 Schema::create('sessions', function($table)
2 {
3 	$table->string('id')->unique();
4 	$table->text('payload');
5 	$table->integer('last_activity');
6 });

ตอนนี้เราก็ใช้คำสั่ง php artisab session:table เป็นอันจบครับ <br /><br /><br /><br /><br /><br /> <a name="cookies"></a> ## Cookies

การดึงค่าจาก cookies

1 $value = Cookie::get('name');

สร้าง cookie และส่งคืนไปให้ผู้ใช้งาน

1 $response = Response::make('Hello World');
2 
3 $response->withCookie(Cookie::make('name', 'value', $minutes));

สร้าง cookie ที่ไม่หมดอายุ

1 $cookie = Cookie::forever('name', 'value');

ประเภทของ session

  • file - sessions จะถูกเก็บไว้ใน app/storage/sessions.
  • cookie - sessions เก็บไว้ใน cookies ที่เข้ารหัส
  • database - sessions เก็บไว้ในฐานข้อมูล
  • memcached / redis - sessions เก็บไว้ใน memory
  • array - เก็บไว้ใน php array

Security ( คลาสที่เกี่ยวกับการเข้ารหัส )

คลาสนี้ใช้ในการสร้างระบบรักษาความปลอดภัยต่างอย่างเช่น การเข้ารหัสเพื่อใช้ใน password,session,cookie <a name="configuration"></a>

<a name="storing-passwords"></a> ## การเก็บรหัสผ่าน

Class Hash ของ laravel ใช้ส่วนขยาย Bcrypt ของ php มาพัฒนาต่อยอด

การสร้างค่า hash

1 $password = Hash::make('secret');

การตรวจสอบค่า hash

1 if (Hash::check('secret', $hashedPassword))
2 {
3 	// The passwords match...
4 }

ตรวจว่า password ต้องการเข้ารหัสอีกครั้ง กรณีลืมรหัสผ่าน

1 if (Hash::needsRehash($hashed))
2 {
3 	$hashed = Hash::make('secret');
4 }

<a name="authenticating-users"></a> ## การยืนยันตัวบุคคล

การล็อกอิน laravel เตรียมเมทอด Auth::attempt มาให้ตัวอย่างการใช้งาน

1 if (Auth::attempt(array('email' => $email, 'password' => $password)))
2 {
3 	return Redirect::intended('dashboard');
4 }

ค่า email เราสามารถเปลี่ยนไปตามใจเราได้ครับ ส่วนเมทอด Redirect::intended ใช้ส่งผู้ใช้งานกลับไปที่ลิ้งที่เข้าเรียกมาครับ

เมื่อเมทอด attempt ถูกเรียก event auth.attempt จะถูกเรียกและ event auth.login จะถูกเรียกเมื่อการเข้าสู่ระบบสำเร็จ

ตรวจสอบว่ามีการล็อกอินค้างอยู่ไหม

1 if (Auth::check())
2 {
3 	// The user is logged in...
4 }

ตัวอย่างการปรับปรุงเมทอด attempt ให้สามารถทำการจำชื่อผู้ใช้กับรหัสผ่านได้

1 if (Auth::attempt(array('email' => $email, 'password' => $password), true))
2 {
3 	// The user is being remembered...
4 }

การกำหนดเงื่อนไขตอนล็อกอิน

1 if (Auth::attempt(array('email' => $email, 'password' => $password, 'active' => 1\
2 )))
3 {
4     // 
5 }

การเข้าถึงเข้อมูลคนที่ล็อกอิน

1 $email = Auth::user()->email;

ใช้เมทอด loginUsingId เพื่อดึง Id ของคนที่ล็อกอินมา

1 Auth::loginUsingId(1);

สมมุตว่าเรากำหนดว่าการเปลี่ยนแปลงเลขบัตรเครดิตต้องใช้รหัสผ่านยืนยันเพิ่มเติม เมทอด validate สามารถทำงานนี้ให้เราได้

การใช้งานการยืนยันตัวตนโดยไม่ได้เข้าสู่ระบบ

1 if (Auth::validate($credentials))
2 {
3 	//
4 }

<br /><br /><br />

การล็อกอินแบบไม่มี session หรือ cookies

1 if (Auth::once($credentials))
2 {
3 	//
4 }

เมทอดที่ใช้ล็อกเอาท์

1 Auth::logout();

<a name="manually"></a> ## การจำลองการล็อกอิน

การล็อกอินแบบ ที่เราจำลองขึ้้นมาเองครับ เมทอดlogin ใช้ค่าจากฐานข้อมูลมาล็อกอินได้ทันทีเลย

1 $user = User::find(1);
2 
3 Auth::login($user);

การป้องกัน CSRF

ทำการแนบค่า token เข้ากับฟอร์ม

1 <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

ตรวจสอบค่า token ที่ถูกส่งมา

1 Route::post('register', array('before' => 'csrf', function()
2 {
3     return 'You gave a valid CSRF token!';
4 }));

<br /><br /><br /><br /><br /><br /> <a name="http-basic-authentication"></a> ## HTTP Basic Authentication

laravel เตรียม filter ชื่อ auth.basic เพื่อตรวจว่า มีการล็อกอินไหม

ตัวอย่าง

1 Route::get('profile', array('before' => 'auth.basic', function()
2 {
3 	// Only authenticated users may enter...
4 }));

โดยค่าเริ่มต้นเเล้วเมทอด basic ใช้คอลัมน์ email ในการตรวจสอบ ถ้าเราจะเปลี่ยนก็ใช้

1 return Auth::basic('username');

laravel เตรียมฟังก์ชัน Oncebasic มาเพื่อการล็อกอินแบบไม่สร้าง session ไว้เหมาะกับการให้ ผู้ใช้งานใช้ในกรณีไปล็อกอินเครื่องที่ไม่ใช่ของตัวเอง

ตัวอย่าง

1 Route::filter('basic.once', function()
2 {
3 	return Auth::onceBasic();
4 });

<br /><br /><br /> <a name="password-reminders-and-reset"></a> ## การจัดการการลืมรหัสผ่าน การลืมรหัสผ่านและการสร้างใหม่ ### ส่งรหัสผ่านใหม่

laravel เตรียมการมาให้เราสามารถสร้างระบบการส่และเปลี่ยนรหัสผ่าน ให้เราโดยการให้ User model ทำการสืบทอด Illuminate\Auth\Reminders\RemindableInterface.

การใช้งาน RemindableInterface

1 class User extends Eloquent implements RemindableInterface {
2 
3 	public function getReminderEmail()
4 	{
5 		return $this->email;
6 	}
7 
8 }

ต่อมาเราก็ต้องสร้างตารางให้ระบบลืมรหัสผ่านก่อนโดย php artisan auth:reminders

สร้างตัว migration ของตารางลืมรหัส

1 php artisan auth:reminders
2 
3 php artisan migrate

การส่งรหัสใช้เมทอด Password::remind

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

1 Route::post('password/remind', function()
2 {
3 	$credentials = array('email' => Input::get('email'));
4 
5 	return Password::remind($credentials);
6 });

หมายเหตุ: เราต้องสร้าง view ที่ชื่อ auth.reminder.emailเพื่อรับ email เองนะครับ

เราสามารถส่งข้อความเพิ่มเติมให้ผู้ใช้โดยส่งพารามิเตอร์ไป $message ไปในฟังก์ชัน remind

1 return Password::remind($credentials, function($message, $user)
2 {
3 	$message->subject('Your Password Reminder');
4 });

<br /><br /> โดยค่าเริ่มต้นเเล้วเมทอด remind จะส่งกลับมาที่หน้าที่เรียกใช้ ถ้าเกิดข้อผิดพลาดขึ้น ตัวแปร errorจะมีค่าขึ้นใน session ส่วนเมื่อสำเร็จตัวแปร success ก็จะปรากฏขึ้นมาใน session แทน หน้าตาของหน้า auth.reminder.email ควรเป็นแบบนี้ครับ

1 @if (Session::has('error'))
2 	{{ trans(Session::get('reason')) }}
3 @elseif (Session::has('success'))
4 	An e-mail with the password reset has been sent.
5 @endif
6 
7 <input type="text" name="email">
8 <input type="submit" value="Send Reminder">

<br /><br /> ### การรีเซตรหัสผ่าน

การสร้าง route เพื่อรับการที่ผู้ใช้งานกดลิ้งทำการรีเซตรหัสผ่าน

1 Route::get('password/reset/{token}', function($token)
2 {
3 	return View::make('auth.reset')->with('token', $token);
4 });

หน้า view ที่ทำการให้ผู้ใช้งานทำการเปลี่ยนรหัสผ่าน

1 @if (Session::has('error'))
2 	{{ trans(Session::get('reason')) }}
3 @endif
4 
5 <input type="hidden" name="token" value="{{ $token }}">
6 <input type="text" name="email">
7 <input type="password" name="password">
8 <input type="password" name="password_confirmation">

<br /><br /><br /><br /> ตัวอย่างการสร้าง route เพื่อทำการรับค่ารหัสผ่านใหม่

 1 Route::post('password/reset/{token}', function()
 2 {
 3 	$credentials = array('email' => Input::get('email'));
 4 
 5 	return Password::reset($credentials, function($user, $password)
 6 	{
 7 		$user->password = Hash::make($password);
 8 
 9 		$user->save();
10 
11 		return Redirect::to('home');
12 	});
13 });

ถ้าการเปลี่ยนรหัสผ่านสำเร็จ User instance และรหัสผ่านใหม่จะถูกเก็บลงฐานข้อมูลและ ส่งกลับไปหน้า home

<a name="encryption"></a> ## Encryption

Laravel เตรียมการเข้ารหัสแบบ AES-256 โดยส่วนเสริม mcrypt ของ PHP มาให้เเล้ว

กาเข้ารหัส

1 $encrypted = Crypt::encrypt('secret');

Note: มั่นใจว่าเราเปลี่ยนค่า key ตรงที่ app/config/app.php ไม่งั้นการเข้ารหัสจะไม่ค่อยปลอดภัยครับ

การถอดรหัส

1 $decrypted = Crypt::decrypt($encryptedValue);

การกำหนดรูปแบบต่างๆ

1 Crypt::setMode('ctr');
2 
3 Crypt::setCipher($cipher);

SSH ( คลาสทที่ใช้จัดการ ftp และ git)

<a name="configuration"></a> ## การตั้งค่า

ไปที่ไฟล์ app/config/remote.php, เราต้องตั้งค่าอาเรย์ connections ซึ่งใช้กำหนดค่าต่างๆ ในการเชื่อมต่อ connections

<a name="basic-usage"></a> ## การใช้งานเบื้องต้น

เรียกใช้

เราใช้เมทอด SSH::run เบื้องต้น

1 SSH::run(array(
2 	'cd /var/www',
3 	'git pull origin master',
4 ));
เรียกใช้พร้อมกับใช้คำสั่งเพิ่มเติม

เราจะใช้เมทอด into เพื่อเรียกใช้คำสั่ง stagging ของ git:

1 SSH::into('staging')->run(array(
2 	'cd /var/www',
3 	'git pull origin master',
4 ));
แคชผลของคำสัั่งเพื่อความรวดเร็ว

ใช้เมทอด run แล้วใส่ฟังก์ชันเข้าไป:

1 SSH::run($commands, function($line)
2 {
3 	echo $line.PHP_EOL;
4 });

<br /><br /> ## Tasks <a name="tasks"></a> ถ้าเราต้องการใช้คำสั่งทีละหลายๆ ตัว สามารถทำได้โดยใช้เมทอด define เช่น ในตัวอย่างเราตั้งชื่อ ชุดคำสั่งว่า deploy :

1 SSH::into('staging')->define('deploy', array(
2 	'cd /var/www',
3 	'git pull origin master',
4 	'php artisan migrate',
5 ));

ข้างบนเป็นการประกาศ ข้างล่างเป็นการเรียกใช้ครับ

1 SSH::into('staging')->task('deploy', function($line)
2 {
3 	echo $line.PHP_EOL;
4 });

<a name="sftp-downlaods"></a> ## SFTP Downloads

การดาวน์โหลดไฟล์นั้น จะใช้เมทอด get ในแล้วใส้ที่อยู่บน FTP กับ บนเครื่องของเราไป

1 SSH::into('staging')->get($remotePath, $localPath);
2 
3 $contents = SSH::into('staging')->getString($remotePath);

<a name="sftp-uploads"></a> ## SFTP Uploads

ส่วนการอัพโหลดไฟล์นั้น ใช้เมทอด putในการอัพโหลด และ putString ในการกำหนดที่อยู่

1 SSH::into('staging')->put($localFile, $remotePath);
2 
3 SSH::into('staging')->putString($remotePath, 'Foo');

<br /><br /><br /><br /> <a name="tailing-remote-logs"></a> ## Tailing Remote Logs

คือการดาวน์โหลดไฟล์ laravel.log ซึ่งเป็นไฟล์ log นั้นเอง ข้างล่างเป็น ตัวอย่างการใช้งานครับ

1 php artisan tail staging
2 
3 php artisan tail staging --path=/path/to/log.file

Responses ( คลาสที่ใช้จัดการส่งข้อมูลกลับ )

บทนี้จะมาพูดถึงคลาส views กับ Response นะครับ <a name="basic-responses"></a> ## Basic Responses

การส่งค่าคืนแบบง่ายๆ

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

สร้างการส่งกลับเอง

คลาส Response สืบทอดมาจากคลาส Symfony\Component\HttpFoundation\Response เราจะมาดูเฉพาะเมทอดที่สำคัญกันนะครับ

ตัวอย่างการสร้างคำตอบกลับนะครับ

1 $response = Response::make($contents, $statusCode);
2 
3 $response->header('Content-Type', $value);
4 
5 return $response;

เพิ่ม cookie ลงไปในคำตอบกลับ

1 $cookie = Cookie::make('name', 'value');
2 
3 return Response::make($content)->withCookie($cookie);

<a name="redirects"></a> ## Redirects การส่งกลับ

ส่งกลับไปที่ route

1 return Redirect::to('user/login');

<br /><br /><br /> ส่งกลับไปพร้อมกับ ข้อความ

1 return Redirect::to('user/login')->with('message', 'Login Failed');

ส่งกลับไปที่ route ที่มีชื่อย่อตามตัวอย่าง

1 return Redirect::route('login');

ส่งกลับไปที่ route ที่มีชื่อย่อตามตัวอย่างพร้อมกับค่า

1 return Redirect::route('profile', array(1));

ส่งกลับไปที่ route ที่มีชื่อย่อตามตัวอย่างพร้อมกับตัวแปร

1 return Redirect::route('profile', array('user' => 1));

**ส่งกลับไปที่ฟังก์ชันใน controller **

1 return Redirect::action('HomeController@index');

ส่งกลับไปที่ฟังก์ชันใน controller พร้อมกับพารามิเตอร์

1 return Redirect::action('UserController@profile', array(1));

ส่งกลับไปที่ฟังก์ชันใน controller พร้อมกับตัวแปร

1 return Redirect::action('UserController@profile', array('user' => 1));

<a name="special-responses"></a> ## การส่งกลับแบบพิเศษ

สร้างการส่งกลับในรูปแบบของ json

1 return Response::json(array('name' => 'Steve', 'state' => 'CA'));

<br /><br /> สร้างการส่งกลับในรูปแบบของ jsonp

1 return Response::json(array('name' => 'Steve', 'state' => 'CA'))->setCallback(Inp\
2 ut::get('callback'));

สร้างการส่งกลับในรูปแบบของการดาวน์โหลดไฟล์

1 return Response::download($pathToFile);
2 
3 return Response::download($pathToFile, $name, $headers);

<a name="response-macros"></a> ## Response Macros

สิ่งที่เพิ่มเข้ามาใน 4.1 คือ เมทอดResponse::macro เป็นการสร้างรูปแบบคือการคืนค่า ในแบบที่เราต้องการ:

1 Response::macro('caps', function($value)
2 {
3 	return Response::make(strtoupper($value));
4 });

ส่วนการเรียกใช้นั้น

1 return Response::caps('foo');

เราต้องเก็บคำสั่ง ไว้ในไฟล์ที่แยกออกมา แล้วก็เพิ่มเข้าไปในไฟล์ start.php เพื่อเรียกใช้งานทุกครั้ง

Validation ( การตรวจสอบข้อมูล )

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

<a name="basic-usage"></a> ## การใช้งานเบื้องต้น

การใช้งานคลาส validator

1 $validator = Validator::make(
2 	array('name' => 'Dayle'),
3 	array('name' => 'required|min:5')
4 );

อาเรย์ตัวแรกคือข้อมูลที่เราจะทำการตรวจนั้นเอง ตัวที่สองคือรูปแบบที่เราต้องการ การใช้เครื่องหมาย | การตรวจสอบออกเป็นหลายๆ แบบ

ใช้อาเรย์ในการกำหนดกฏ

1 $validator = Validator::make(
2 	array('name' => 'Dayle'),
3 	array('name' => array('required', 'min:5'))
4 );

คลาส Validator จะสร้างเมทอด ชื่อ fails (หรือ passes) เพื่อตรวจสอบผล

1 if ($validator->fails())
2 {
3 	// The given data did not pass validation
4 }

ถ้าไม่ผ่านเราสามารถดึงข้อความแสดงข้อผิดพลาดได้.

1 $messages = $validator->messages();

เมทอด failed ใช้ในการเข้าถึงกฏที่เราตั้งไว้

1 $failed = $validator->failed();

<a name="working-with-error-messages"></a> ## การจัดการข้อความแสดงข้อผิดพลาด

เมื่อเรียกเมทอด messages บนตัว Validator instance,เราจะได้รับ MessageBag instance ที่จะมีเมทอดให้เราจัดการข้อความ

แสดงข้อความแสดงข้อผิดพลาดเฉพาะตัวแรก

1 echo $messages->first('email');

รับข้อความแสดงข้อผิดพลาดทั้งหมด

1 foreach ($messages->get('email') as $message)
2 {
3 	//
4 }

รับข้อความแสดงข้อผิดพลาดจากทุกคอลัมน์

1 foreach ($messages->all() as $message)
2 {
3 	//
4 }

ตรวจว่ามีข้อความแสดงข้อผิดพลาดจากคอลัมน์ eamil ไหม

1 if ($messages->has('email'))
2 {
3 	//
4 }

รับข้อความแสดงข้อผิดพลาดโดยใส่รูปแบบให้ด้วย

1 echo $messages->first('email', '<p>:message</p>');

หมายเหตุ: โดยเริ่มต้น, รูปแบบข้อความจะถูกจัดในรูปแบบที่นำไปใช้งานร่วมกับ twiiter bootstrap ได้.

<br /><br /><br /><br /> รับข้อความแสดงข้อผิดพลาดทั้งหมดพร้อมใส่รูปแบบ

1 foreach ($messages->all('<li>:message</li>') as $message)
2 {
3 	//
4 }

<a name="error-messages-and-views"></a> ## การแสดงข้อความแสดงข้อผิดพลาดบน view

ตัวอย่างนี้เราจะส่งข้อความแสดงข้อผิดพลาด ไปให้ view

 1 Route::get('register', function()
 2 {
 3 	return View::make('user.register');
 4 });
 5 
 6 Route::post('register', function()
 7 {
 8 	$rules = array(...);
 9 
10 	$validator = Validator::make(Input::all(), $rules);
11 
12 	if ($validator->fails())
13 	{
14 		return Redirect::to('register')->withErrors($validator);
15 	}
16 });

ถ้าการตรวจสอบไม่ผ่านเราจะใช้เมทอด withErrors ส่งข้อความแสดงข้อผิดพลาด ขึ้นไปบน View ด้วย

ไม่ควรส่งข้อความแสดงข้อผิดพลาด ไปบน Route ทีเป็น method GET เพราะ laravel จะตรวจสอบข้อผิดพลาดบน session ทุกคำร้องขอ

เมื่อทำการรีไดเรคเราสามารถเข้าถึงข้อความแสดงข้อผิดพลาด โดยใชตัวแปร$errors ดังตัวอย่างครับ

1 <?php echo $errors->first('email'); ?>

<br /><br /><br /><br /> <a name="available-validation-rules"></a> ## กฏในการตรวจสอบที่ laravel เตรียมไว้

<a name="rule-accepted"></a> #### accepted

ค่าทีจะผ่านคือ yes, on, or 1.เหมาะสำหรับใช้ในการตรวจสอบว่ายอมรับ “Terms of Service” ไหม

<a name="rule-active-url"></a> #### active_url

ตรวจสอบว่าลิ้งตายยัง โดยใช้ checkdnsrr ซึ่งเป็น PHP function.

<a name="rule-after"></a> #### after:date

ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของเวลาหลักจากใช้ strtotime อยู่หลังสุดแปลงไหม

<a name="rule-alpha"></a> #### alpha

ตรวจสอบว่าค่าที่ส่งมาเป็นรูปแบบของตัวอักษรต่างๆ ไหม

<a name="rule-alpha-dash"></a> #### alpha_dash

ตรวจสอบว่าค่าที่ส่งมาเป็นรูปแบบของตัวเลขที่มีเครื่องหมาย _ รวมอยู่ด้วยไหม

<a name="rule-alpha-num"></a> #### alpha_num

ตรวจสอบว่าค่าที่ส่งมาเป็นรูปแบบของตัวเลขไหม

<a name="rule-before"></a> #### before:date

ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของเวลาหลักจากใช้ strtotime อยู่หน้าสุดไหม

<a name="rule-between"></a> #### between:min,max

ตรวจสอบว่าค่าที่ส่งมาเป็นมีค่าอยู่ระหว่าง min กับ max ไหม

<a name="rule-confirmed"></a> #### confirmed

ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของฟอร์มที่มีรูปแบบ ชื่อ_confirmation ยกตัวอย่างการ ตรวจสอบ password,ว่าตรงกับpassword_confirmation ไหม

<a name="rule-date"></a> #### date

ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของเวลาหลักจากใช้ strtotime ไหม.

<a name="rule-date-format"></a> #### date_format:format

ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของเวลาที่กำหนดไหม

<a name="rule-different"></a> #### different:field

ค่าตรง field ต้องมีค่าต่างจากค่าที่ป้อนเข้ามาถึงจะผ่าน

<a name="rule-email"></a> #### email

ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของ email

<a name="rule-exists"></a> #### exists:table,column

ฟอร์มที่อยู่ในการตรวจสอบต้องมีชื่อตรงกับคอลัมน์ในฐานข้อมูล

การใช้งานเบื้องต้น

1 'state' => 'exists:states'

การใช้งานโดยใส่ค่าที่ต้องการตรวจไปหลายค่า

1 'state' => 'exists:states,abbreviation'

เราสามารถกำหนดเงื่อนไขให้กฏคล้ายๆการทำคิวรี้ ครับ

1 'email' => 'exists:staff,email,account_id,1'

<a name="rule-image"></a> #### image

ตรวจสอบว่าค่าที่ส่งมาเป็นรูปภาพมีนามสกุล(jpeg, png, bmp, or gif) ไหม

<a name="rule-in"></a> #### in:foo,bar,…

ตรวจสอบว่าค่าที่ส่งมามีค่าตรงกับค่าใน foo,bar ไหม

<a name="rule-integer"></a> #### integer

ตรวจสอบว่าค่าที่ส่งมามีรูปแบบของเลขจำนวนเต็มไหม

<a name="rule-ip"></a> #### ip

ตรวจสอบว่าค่าที่ส่งมามีรูปแบบของ IP address.

<a name="rule-max"></a> #### max:value

ตรวจสอบว่าค่าที่ส่งมามีค่าน้อยกว่าค่าที่กำหนดไว้

<a name="rule-mimes"></a> #### mimes:foo,bar,…

ตรวจสอบว่าค่าที่ส่งมามีรูปแบบของ mime type ตรงกับที่กำหนดไหม

ตัวอย่างการตรวจสอบนามสกุลของไฟล์

1 'photo' => 'mimes:jpeg,bmp,png'

<a name="rule-min"></a> #### min:value

ตรวจสอบว่าค่าที่ส่งมามีจำนวนน้อยกว่าไหมถ้ามีน้อยกว่าก็ไม่ผ่าน

<a name="rule-not-in"></a> #### not_in:foo,bar,…

ตรวจสอบว่าค่าที่ส่งมามีค่าตรงกับค่าที่ตั้งไว้ไหม ถ้ามีก็ไม่ผ่านครับ

<a name="rule-numeric"></a> #### numeric

ตรวจสอบว่าค่าที่ส่งมาเป็นตัวเลขไหม

<a name="rule-regex"></a> #### regex:pattern

ตรวจสอบว่าค่าที่ส่งมามีรูปแบบกับ regular expression ที่กำหนดไว้ไหม

<a name="rule-required"></a> #### required

ตรวจสอบว่าค่าที่ส่งมาเป็นค่าว่างไหม ถ้าเป็นก็ไม่ผ่านครับ <br /><br /><br /> <a name="rule-required-if"></a> #### required_if:field,value

ตรวจว่าค่าใน field ต้องไม่ว่างและ ตรงกับ value

<a name="rule-required-with"></a> #### required_with:foo,bar,…

ตรวจว่าฟิล foo ต้องมีค่าหาก bar มีค่าด้วย

<a name="rule-required-without"></a> #### required_without:foo,bar,…

ตรวจว่าฟิล foo ต้องมีค่าหาก bar ไม่มีค่า

<a name="rule-same"></a> #### same:field

ตรวจว่าค่าที่ส่งเข้ามาซ้ำกับค่าที่กำหนดไว้ไหม

<a name="rule-size"></a> #### size:value

ตรวจว่าค่าที่ส่งเข้ามาตรงกับที่กำหนดไว้ไหม กรณีเป็นคำจะตรวจสอบจำนวนคำ เป็นตัวเลขก็เทียบตามค่า เป็ไฟล์เทียบตามขนาดของไฟล์เป็นกิโลไบต์

<a name="rule-unique"></a> #### unique:table,column,except,idColumn

ตรวจว่าค่าที่ส่งมาซ้ำกับในตารางไหม.

ตัวอย่างการใช้ตรวจว่าอีเมล์นี้มีในตาราง user ไหม

1 'email' => 'unique:users'

ตัวอย่างการใช้ตรวจว่าอีเมล์นี้มีในตาราง user ตรงคอลัมน์ email-address ไหม

1 'email' => 'unique:users,email_address'

ตัวอย่างการใช้ตรวจว่าอีเมล์นี้มีในตาราง user ตรงคอลัมน์ email-address ไหม โดยไม่สนใจ id ที่มีค่าเท่ากับ 10

1 'email' => 'unique:users,email_address,10'

<a name="rule-url"></a> #### url ตรวจว่าค่าเป็น url ไหม

<br /><br /> <a name="custom-error-messages"></a> ## การกำหนดข้อความแสดงข้อผิดพลาดเอง

เราสามารถปรับแต่งข้อความที่แสดงข้อผิดพลาดได้

ตัวอย่าง

1 $messages = array(
2 	'required' => 'The :attribute field is required.',
3 );
4 
5 $validator = Validator::make($input, $rules, $messages);

การใช้ข้อความที่เรากำหนดร่วมกับ Place-Holders

1 $messages = array(
2 	'same'    => 'The :attribute and :other must match.',
3 	'size'    => 'The :attribute must be exactly :size.',
4 	'between' => 'The :attribute must be between :min - :max.',
5 	'in'      => 'The :attribute must be one of the following types: :values',
6 );

กำหนดข้อความให้แต่ละคอลัมน์เลย

1 $messages = array(
2 	'email.required' => 'We need to know your e-mail address!',
3 );

บางกรณีเราต้องการกำหนดข้อความที่แสดงให้เป็นเฉพาะแต่ละภาษาไป ซึ่งเราต้องไปเพิ่มที่อาเรย์ชื่อ custom ใน app/lang/xx/validation.php ตาม ภาษาที่ไป

คัวอย่าง

1 'custom' => array(
2 	'email' => array(
3 		'required' => 'We need to know your e-mail address!',
4 	),
5 ),

<br /><br /> <a name="custom-validation-rules"></a> ## การสร้างตัวตรวจสอบ

เราสามารถสร้างฟังก์ชันในการตรวจสอบได้เองโดย laravel เตรียมเมทอด Validator::extend มาเพื่อการนั้นครับ

ตัวอย่าง

1 Validator::extend('foo', function($attribute, $value, $parameters)
2 {
3 	return $value == 'foo';
4 });

ตัวอย่างข้างบนเรารับตัวแปรมาสามตัวครับ $attribute คือชื่อข้อมูลที่จะตรวจ $value ค่าของข้อมูล $parameters ค่าอื่นๆ

You may also pass a class and method to the extend method instead of a Closure:

1 Validator::extend('foo', 'FooValidator@validate');

มีอีกวิธีในการสร้างคลาสของเราเองโดยการสืบทอด Illuminate\Validation\Validator ทีนี้ฟังก์ชันต้องมีคำว่า validateนำหน้าด้วยนะครับ

ตัวอย่าง

 1 <?php
 2 
 3 class CustomValidator extends Illuminate\Validation\Validator {
 4 
 5 	public function validateFoo($attribute, $value, $parameters)
 6 	{
 7 		return $value == 'foo';
 8 	}
 9 
10 }

<br /><br /><br /><br /> ต่อมาเราต้องเอาคลาสของเรามาลงทะเบียน

1 Validator::resolver(function($translator, $data, $rules, $messages)
2 {
3 	return new CustomValidator($translator, $data, $rules, $messages);
4 });

เราสามารถสร้างเมทอดที่ใช้ในการแสดงข้อผิดพลาดโดยตามรูปแบบนี้ครับ replaceXXX ตามตัวอย่าง

1 protected function replaceFoo($message, $attribute, $rule, $parameters)
2 {
3 	return str_replace(':foo', $parameters[0], $message);
4 }

Unit Testing

Laravel สร้างขึ้นมาด้วยแนวคิดของการทดสอบเป็นเบื้องต้นอยู่เเล้วครับ โดยหลักแล้วจะสนับสนุนไลบราลี่ PHPUnit เป็นพื้นฐาน และ phpunit.xmlไฟล์ได้ถูกเตรียมการเอาไว้ให้แล้ว. Laravel เตรียมคลาส Symfony HttpKernel, DomCrawler, และ BrowserKit components ที่อนุญาตให้เราจำลองบราวเซอร์ขึ้นมาเเละเข้าไปแก้ไขไฟล์ html ได้ ตัวอย่างไฟล์อยู่ที่โฟลเดอร์ app/tests <a name="defining-and-running-tests"></a> ## Defining & Running Tests

การสร้างไฟล์สำหรับทดสอบนั้นเราจะไปสร้างที่โฟลเดอร์ app/tests สร้างคลาสที่สืบทอดคลาส TestCase.

ตัวอย่างคลาสสำหรับใช้ทดสอบ

1 class FooTest extends TestCase {
2 
3 	public function testSomethingIsTrue()
4 	{
5 		$this->assertTrue(true);
6 	}
7 
8 }

เราจะทำการทดสอบโดยรัน phpunit บน commandline

หมายเหตุ: ถ้าคุณประกาศเมทอด setUp มั่นใจว่าได้เรียก parent::setUpแล้ว

<a name="test-environment"></a> ## สภาวะการตั้งค่าสำหรับการทดสอบ

เมื่อใช้งาน unit tests, Laravel จะทำการเปลี่ยนการสภาวะการตั้งค่าให้ไปเป็น testing. และจะตัดการทำงานของ session และ cache หมายความว่าจะไม่มีแคชและ session เกิดขึ้นระหว่างการทดสอบ <br /><br /><br /><br /><br /><br /> <a name="calling-routes-from-tests"></a> ## การเรียก Routes ในขณะทดสอบ

ตัวอย่างการเรียก Route ในขณะทำกาารทดสอบ

1 $response = $this->call('GET', 'user/profile');
2 
3 $response = $this->call($method, $uri, $parameters, $files, $server, $content);

เราสามารถตรวจสอบออปเจค Illuminate\Http\Response

1 $this->assertEquals('Hello World', $response->getContent());

ตัวอย่างการเรียก Controller ในขณะทดสอบ

1 $response = $this->action('GET', 'HomeController@index');
2 
3 $response = $this->action('GET', 'UserController@profile', array('user' => 1));

เมทอด getContent จะส่งค่าเป็นตัวอักษรกลับคืนมา View เราสามารถเข้าถึงได้ด้วยตัวแปร original

1 $view = $response->original;
2 
3 $this->assertEquals('John', $view['name']);

ถ้าจะเรียก HTTPS route,เราต้องใช้เมทอดcallSecure

1 $response = $this->callSecure('GET', 'foo/bar');

DOM Crawler

คลาส DOM Crawler ทำให้เราสามารถตรวจสอบ html ที่ถูกสร้างขึ้นมาระหว่างการทดสอบได้ ตัวอย่างการใช้

1 $crawler = $this->client->request('GET', '/');
2 
3 $this->assertTrue($this->client->getResponse()->isOk());
4 
5 $this->assertCount(1, $crawler->filter('h1:contains("Hello World!")'));

<a name="mocking-facades"></a> ## Mocking Facades

เมื่อเราทำการทดสอบ,เราจะทำการจำลองในการเรีกคลาส Facade ตัวอย่างเราจะทำการเรียก controller

1 public function getIndex()
2 {
3 	Event::fire('foo', array('name' => 'Dayle'));
4 
5 	return 'All done!';
6 }

เราสามารถจำลองคลาสEventโดยใช้เมทอด shouldReceive

การจำลองคลาส Facade

1 public function testGetIndex()
2 {
3 	Event::shouldReceive('fire')->once()->with(array('name' => 'Dayle'));
4 
5 	$this->call('GET', '/');
6 }

หมายเหตุ: คุณไม่ควรจำลองคลาส Facade Request ใช้เมทอด call ดีกว่าครับ

<a name="framework-assertions"></a> ## Framework Assertions

เมทอด assert ใช้ในการตรวจสอบว่าค่าที่ออกมาตรงกับที่เราคาดหวังไว้ไหม

คาดหวังว่าค่าที่ส่งมาจะไม่ผิดพลาด

1 public function testMethod()
2 {
3 	$this->call('GET', '/');
4 
5 	$this->assertResponseOk();
6 }

คาดหวังว่าจะเป็น 403

1 $this->assertResponseStatus(403);

คาดหวังว่าฟังก์ชันจะส่งกลับไปที่ route

1 $this->assertRedirectedTo('foo');
2 
3 $this->assertRedirectedToRoute('route.name');
4 
5 $this->assertRedirectedToAction('Controller@method');

คาดหวังว่าในหน้า view จะมีค่า

1 public function testMethod()
2 {
3 	$this->call('GET', '/');
4 
5 	$this->assertViewHas('name');
6 	$this->assertViewHas('age', $value);
7 }

คาดหวังว่าใน session จะมีค่า

1 public function testMethod()
2 {
3 	$this->call('GET', '/');
4 
5 	$this->assertSessionHas('name');
6 	$this->assertSessionHas('age', $value);
7 }

<a name="helper-methods"></a> ## Helper Methods

คลาส TestCase มีเมทอดช่วยให้เราทำการทดสอบได้ง่ายๆ เยอะเลยครับ.

เมทอด beใช้ในการจำลองการล็อกอิน

ตัวอย่าง

1 $user = new User(array('name' => 'John'));
2 
3 $this->be($user);

Redis

Redis เป็นโอเพ่นซอร์สฐานข้อมูลขนาดเล็ก ที่เก็บข้อมูลในรูปแบบ คีย์กับค่า หนึ่งค่าต้องมีคีย์กำกับ ประมาณนี้ครับ อยากรู้จักมากกว่านี้ต้องลองไปเล่นที่ try redis โดยข้อมูลที่อยู่ในนี้จะมี strings, hashes, lists, sets, และ sorted sets.

<a name="configuration"></a> ## การปรับแต่ง

การปรับแต่ง redis เราทำใน app/config/database.php ในนี้เราจะเห็นอาเรย์ชื่อ redis แบบนี้ครับ

1 'redis' => array(
2 
3 	'cluster' => true,
4 
5 	'default' => array('host' => '127.0.0.1', 'port' => 6379),
6 
7 ),

โดยค่าเริ่มต้นเเล้ว ถูกตั้งให้สนับสนุนการพ้ฒนาบนเครื่อง เราสามารถปรับแต่งได้ตามใจครับ อาเรย์ชื่อ cluster ใช้เพื่อบอกให้ redis ที่อยู่ในเครื่องทำการ client-side sharding ข้าม Redis nodes ของคุณ, ทำให้เราสามารถสร้าง ram จำนวนมากได้. แต่การทำ client-side sharding แต่เราไม่สามารถจับการ failover ได้

<a name="usage"></a> ## การใช้งาน

เราสามารถสร้างตัวแปรที่เป็นตัวแทนของเมทอด Redis::connection โดยการ

1 $redis = Redis::connection();

เรายังไม่ได้กำหนดชื่อ server redis ของเราต้องกำหนดก่อนนะครับ

1 $redis = Redis::connection('other');

ถ้าอยากศึกษาต่อไปที่นี้ครับ Redis commands ในการจัดการต่างๆ laravel มีฟังก์ชันต่างๆ มาให้เเล้วครับ:

1 $redis->set('name', 'Taylor');
2 
3 $name = $redis->get('name');
4 
5 $values = $redis->lrange('names', 5, 10);

ถ้าไม่ต้องการใช้คำสั่ง laravel ก็สามารถใช้เมทอด command ในการใช้คำสั่งของ redis ตรงๆได้

1 $values = $redis->command('lrange', array(5, 10));

คลาส Redis ที่เป็นตัว static คลาสครับ:

1 Redis::set('name', 'Taylor');
2 
3 $name = Redis::get('name');
4 
5 $values = Redis::lrange('names', 5, 10);

<a name="pipelining"></a> ## Pipelining

Pipelining คือการส่งคำสั่งหลายๆ ตัวไปยัง redis server laravel มีเมทอด pipeline มาให้ใช้

ตัวอย่าง

1 Redis::pipeline(function($pipe)
2 {
3 	for ($i = 0; $i < 1000; $i++)
4 	{
5 		$pipe->set("key:$i", $i);
6 	}
7 });

Localization ( การทำหลายภาษา )

<a name="introduction"></a> ## แนะนำ

คลาส Lang จะทำหน้าที่แปลภาษาในเบื้องต้นให้กับเมนูหรือป้ายกำหับต่างๆ ในเว็บของเรา

<a name="language-files"></a> ## ไฟล์ที่เก็บข้อมูลภาษา

ถูกเก็บไว้ที่โฟลเดอร์ app/lang โดยโครงสร้างจะเป็นแบบนี้

1 /app
2 	/lang
3 		/en
4 			messages.php
5 		/es
6 			messages.php

ไฟล์ที่เก็บภาษาจะเก็บในรูปแบบอาเรย์:

ตัวอย่างของไฟล์ภาษา

1 <?php
2 
3 return array(
4 	'welcome' => 'Welcome to our application'
5 );

โดยค่าเริ่มต้นเเล้ว ค่าภาษาจะถูกกำหนดไว้ที่ app/config/app.php แต่ถ้าจะตั้งเราจะตั้งแบบไม่ให้คลุมไปทั้งเว็บก็ใช้เมทอด App::setLocale

ตัวอย่าง

1 App::setLocale('es');

<br /><br /><br /><br /> <a name="basic-usage"></a> ## การใช้งานเบื้องต้น

การดึงค่าจากไฟล์ภาษา

1 echo Lang::get('messages.welcome');

ฟังก์ชัน get ใช้ดึงค่าโดยมีพารามิเตอร์คือชื่อภาษาและแถวที่ต้องการดึง

การส่งพารามิเตอร์ไป

พารามิเตอร์ที่สองจะใช้รับค่าที่จะส่งมา

1 'welcome' => 'Welcome, :name',

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

1 echo Lang::get('messages.welcome', array('name' => 'Dayle'));

ตรวจว่าในไฟล์ภาษามีคอลัมน์นี้อยู่

1 if (Lang::has('messages.welcome'))
2 {
3 	//
4 }

<a name="pluralization"></a> ## Pluralization

Pluralization คือโครงสร้างไวยากรณ์ของแต่ละภาษาที่มีความแตกต่างกัน แต่เราใช้เครื่องหมาย ในการสร้างตัวเลือกระหว่างเอกพจน์กับพหูพจน์:

1 'apples' => 'There is one apple|There are many apples',

เเล้วเราก็ใช้ฟังก์ชัน Lang::choice ในการเลือก

1 echo Lang::choice('messages.apples', 10);

เนื่องจากการแปลภาษาของ laravel สืบทอดมาจากของ Symfony เราจึงสามารถสร้างเงื่อนไขที่ซับซ้อนดังตัวอย่างได้

1 'apples' => '{0} There are none|[1,19] There are some|[20,Inf] There are many',

Cache

<a name="configuration"></a> ### การตั้งค่า

Laravel เตรียมรูปแบบของการ ` cache ไว้ให้เราใช้เเล้วหลายตัวเลยนะครับ . ซึ่งรายชื่อและการตั้งค่าอยู่ที่ app/config/cache.php`. ในไฟล์เราสามารถตั้งค่าให้กับ cache ที่เราชื่นชอบได้เลย Laravel สนับสนุนทั้ง Memcached กับ Redis อยู่แล้วครับ.

ก่อนจะทำการตั้งค่าใดๆ ลองไปศึกษาก่อนนะครับ ตัว laravel ใช้ file cache เป็นตัวเริ่มต้นนะครับ ถ้าเว็บไซต์มีขนาดใหญ่ควรเปลี่ยนไปใช้ Memcached หรือ APC จะดีกว่า

<a name="cache-usage"></a> ### การใช้งาน Cache


การเก็บค่าลง cache

1 Cache::put('key', 'value', $minutes);

เก็บลงในกรณีที่ไม่มีค่านั้นอยู่

1 Cache::add('key', 'value', $minutes);

ตรวจว่ามีค่าไหม

1 if (Cache::has('key'))
2 {
3 	//
4 }

ดึงค่าจากแคช

1 $value = Cache::get('key');

ดึงค่าโดยเรียกค่าเริ่มต้น

1 $value = Cache::get('key', 'default');
2 
3 $value = Cache::get('key', function() { return 'default'; });

กำหนดให้ค่าชนิดนี้ไม่มีวันหมดอายุ

1 Cache::forever('key', 'value');

บางเวลาเราต้องการเรียกใช้ค่าจากแคช แต่ไม่มีค่าแล้ว เราสามารถเรียกใช้ Cache::remember โดยการดึงค่าจากฐานข้อมูลขึ้นมาเก็บไว้ในแคช

1 $value = Cache::remember('users', $minutes, function()
2 {
3 	return DB::table('users')->get();
4 });

และยังสามารถผสมคำสั่ง remember กับ forever

1 $value = Cache::rememberForever('users', function()
2 {
3 	return DB::table('users')->get();
4 });

เราสามารถเก็บค่าชนิดใดก็ได้เพราะรูปแบบการเก็บค่าใช้แบบ serialize

การลบค่าออกจากคีย์

1 Cache::forget('key');

<a name="increments-and-decrements"></a> ## การเพิ่มและการลดค่า

แคชทุกชนิดยกเว้น file กับ database สนับสนุนการทำเพิ่มและลดค่าของแคช

การเพิ่มค่า

1 Cache::increment('key');
2 
3 Cache::increment('key', $amount);

การลดค่า

1 Cache::decrement('key');
2 
3 Cache::decrement('key', $amount);

<a name="cache-sections"></a> ## Cache Sections

หมายเหตุ: Cache sections ไม่สนับสนุนแคชแบบ file หรือ database

Cache sections คือการให้เราสามารถจับกลุ่มให้กับแคชที่มีรูปแบบการเก็บค่าที่คล้ายๆ กันโดยใช้คำสั่งsection

ตัวอย่างการใช้งาน Cache section

1 Cache::section('people')->put('John', $john);
2 
3 Cache::section('people')->put('Anne', $anne);

การเข้าถึงค่าของแคช

1 $anne = Cache::section('people')->get('Anne');

flush คือการลบค่าออก:

1 Cache::section('people')->flush();

<a name="database-cache"></a> ## การเก็บแคชไว้ในฐานข้อมูล

เมื่อเราจะใช้ฐานข้อมูลเก็บค่าแคช เราต้องเพิ่มตารางที่จะใช้เก็บก่อน นี่คือตัวอย่างการสร้างตารางที่ใช้เก็บแคชในรูปแบบ ของ laravel

1 Schema::create('cache', function($table)
2 {
3 	$table->string('key')->unique();
4 	$table->text('value');
5 	$table->integer('expiration');
6 });

Events

<a name="basic-usage"></a> ## การใช้งานเบื้องต้น

คลาส Event เตรียมมาให้เราใช้ในการดักจับเหตุการณ์ต่างๆที่เกิดขึ้นบน เว็บของเรา หมายเหตุ Event คือเหตุการใดที่เกิดขึ้นบนเว็บเรา ยกตัวอย่างการเพิ่มลบแก้ไข , Listener คือ ฟังก์ชันที่คอยดักจับเหตุการ , fire คือฟังก์ชันที่สั่งให้เกิดเหตุการขึ้นเพื่อให้ listerner ทำงาน

ใครนึกไม่ออกให้นึกถึง event บน jquery ครับ

การดักรอฟังเหตุการณ์

1 Event::listen('user.login', function($user)
2 {
3 	$user->last_login = new DateTime;
4 
5 	$user->save();
6 });

การสั่งให้เกิดเหตุการณ์ขึ้น

1 $event = Event::fire('user.login', array($user));

เราสามารถกำหนดลำดับเหตุการที่จะให้เกิดได้ โดยค่าลำดับที่เกิดเรียงจากน้อยไปหามาก.

การใช้ลำดับควบคุมการทำงาน

1 Event::listen('user.login', 'LoginHandler', 10);
2 
3 Event::listen('user.login', 'OtherHandler', 5);

บางครั้งเราอยากจะให้ฟังก์ชันที่ดักฟังอยู่ทำงานแค่ครั้งเดียว เราสามารถใช้การ return false เพื่อหยุดฟังก์ชันนี้ได้ <br /><br /><br /><br /> หยุดการทำงานของเหตุการ

1 Event::listen('user.login', function($event)
2 {
3 	// Handle the event...
4 
5 	return false;
6 });

### ประกาศไว้ตรงไหนดี

เราก็สร้างไฟล์อีกไฟล์ให้ชื่อว่า event.php ไว้ตรงที่เดียวกับไฟล์ route.php แล้วนำไป include ไว้ในไฟล์ start.php ในโฟลเดอร์ global

<a name="wildcard-listeners"></a> ## Wildcard Listeners

คือการดักฟังทุกเหตุการเลย ไม่เฉพาะเจาะจงเเล้ว

การใช้งาน

1 Event::listen('foo.*', function($param, $event)
2 {
3 	// Handle the event...
4 });

ทีนี้ถ้ามีเหตุการณ์อะไรที่ขึ้นต้นด้วย foo..ฟังก์ชันในตัวอย่างก็จะทำงาน

<a name="using-classes-as-listeners"></a> ## ใช้ Classes กับ Listeners

ในบางกรณี เราสามารถผูกคลาสเข้ากับเหตุการได้ โดย laravel จะผูกคลาสเข้าไป

ตัวอย่าง

1 Event::listen('user.login', 'LoginHandler');

โดยค่าเริ่มต้นฟังก์ชัน handle ในคลาส LoginHandlerจะถูกเรียกก่อนเลย เหมือนกับ _construct <br /><br /><br /><br /> ฟังก์ชัน handle จะถูกเรียกใช้เลย

1 class LoginHandler {
2 
3 	public function handle($data)
4 	{
5 		//
6 	}
7 
8 }

ถ้าเราไม่ต้องการ ก็ผูกเมทอดที่เราต้องการเข้าไปดังนี้ครับ

1 Event::listen('user.login', 'LoginHandler@onLogin');

<br /><br /> <a name="queued-events"></a> ## การเรียงลำดับเหตุการ

ใช้ฟังก์ชัน queue กับ flush ในการเรียงลำดับการเกิดเหตุการ

การสร้างลำดับ

1 Event::queue('foo', array($user));

<a name="event-subscribers"></a> ## Event Subscribers

คือคลาสที่เราแบ่งกลุ่มฟังก์ชันที่ใช้จัดการเหตุการ โดยต้นทางมาจากฟังก์ชัน subscribe

ตัวอย่าง

1 $subscriber = new UserEventHandler;
2 
3 Event::subscribe($subscriber);

<br /><br /> ตัวอย่างการสร้างคลาส Subscriber

 1 class UserEventHandler {
 2 
 3 	/**
 4 	 * track user login
 5 	 */
 6 	public function onUserLogin($event)
 7 	{
 8 		//
 9 	}
10 
11 	/**
12 	 * track user logout
13 	 */
14 	public function onUserLogout($event)
15 	{
16 		//
17 	}
18 
19 	/**
20 	 * fire event to observer event
21 	 *
22 	 */
23 	public function subscribe($events)
24 	{
25 		$events->listen('user.login', 'UserEventHandler@onUserLogin');
26 
27 		$events->listen('user.logout', 'UserEventHandler@onUserLogout');
28 	}
29 
30 }

เมื่อประกาศคลาสแล้ว การนำไปใช้งานเราก็ต้องเอาไปลงทะเบียนกับคลาสหลัก

Pagination ( การแบ่งการแสดงข้อมูล )

<a name="configuration"></a> ## การตั้งค่า

การตั้งค่าการของอยู่ที่ app/config/view.php ตัวแปรชื่อ pagination ในการแบ่งหน้า ฟังก์ชัน pagination::slider ใช้ในการสร้างเลขหน้า pagination::simple ใช้สร้างปุ่ม “previous” และ “next”

<a name="usage"></a> ## การใช้งาน

การใช้งานมีอยู่หลายรูปแบบ เเต่ที่ง่ายที่สุดใช้เมทอด paginateบน query builder หรือ Eloquent model.

ตัวอย่างโดยใช้ query builder

1 $users = DB::table('users')->paginate(15);

You may also paginate Eloquent models:

ตัวอย่างโดยใช้ Eloquent Model

1 $users = User::where('votes', '>', 100)->paginate(15);

ในตัวอย่างเรากำหนดจำนวนข้มูลต่อหน้าได้ ส่วนการแสดงผลบน view เราจะใช้ฟังก์ชัน links

1 <div class="container">
2 	<?php foreach ($users as $user): ?>
3 		<?php echo $user->name; ?>
4 	<?php endforeach; ?>
5 </div>
6 
7 <?php echo $users->links(); ?>

เพียงแค่นี้ก็จะได้การแบ่งหน้าละครับ.

เราสามารถจัดการๆ แบ่งหน้าได้โดยฟังก์ชันต่อไปนี้ครับ:

  • getCurrentPage
  • getLastPage
  • getPerPage
  • getTotal
  • getFrom
  • getTo

บางครั้งเราอยากสร้างเองเพราะอาจจะมีข้อมูลที่ต้องผ่านการคำนวนหลายขั้น ก็ใช้เมทอดนี้เลยครับ Paginator::make

ตัวอย่าง

1 $paginator = Paginator::make($items, $totalItems, $perPage);

<a name="appending-to-pagination-links"></a> ## การสร้างลิ้งของการแบ่งหน้า

เราสามารทำการเรียงลำดับการแสดงผลได้โดยใช้เมทอด appends เหมือนในตัวอย่าง

1 <?php echo $users->appends(array('sort' => 'votes'))->links(); ?>

ลิ้งที่ออกมาหน้าตาจะเป็นแบบนี้

1 http://example.com/something?page=2&sort=votes

ส่วนที่เพิ่มเข้ามาใน 4.1 จะเป็นการสร้างลิ้งแบ่งหน้าแบบ ajax ด้วยตัวอย่างนี้

1 <?php echo $users->fragment('foo')->links(); ?>

เราจะได้ลิ้งแบบนี้มา

http://example.com/something?page=2#foo

ซึ่งเราสามารถประยุกต์ไปใช้ร่วมกับ ajax ได้

Artisan ( การเรียกใช้งาน php ผ่านทาง cmd )

<a name="introduction"></a> ## แนะนำ

Artisan คือ ชุดคำสั่งที่ใช้เรียกงานผ่านทาง command line เพื่อช่วยให้จัดการงานต่างให้ง่าย รวดเร็วขึ้น ซึ่ง laravel นำ Class console ของ symfony มาปรับใช้

<a name="usage"></a> ## การใช้งาน

ในการเรียกดูคำสั่งทั้งหมดใช้คำสั่ง list

1 php artisan list

ทุกคำสั่งจะมีวิธีการใช้ให้เราดู โดยเพิ่ม parameter help เข้าไปนะครับ

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

1 php artisan help migrate

เราสามารถเรียก พร้อมกับเปลี่ยนการตั้งค่าโดยรวมของเว็บโดยเพิ่มพารามิเตอร์ --env

ตัวอย่างนี้เราเรียกในการตั้งค่าแบบ local

1 php artisan migrate --env=local

จะเรียกดูรุ่นของ laravel ก็ได้โดยพารามิเตอร์ --version

1 php artisan --version

<br /><br /><br /><br /><br /><br /> ## การสร้างคำสั่งขึ้นใช้งานเอง ##

เราสามารถสร้างคำสั่ง artisan ขึ้นมาใช้ โดยไฟล์จะเก็บที่โฟลเดอร์ app/commands ถ้าเราไม่อยากเก็บไว้ตรงนี้ก็ไปตั้งค่าที่ไฟล์ composer.json ได้

<a name="building-a-command"></a> ## การสร้างคำสั่ง

เริ่มสร้างคลาส

เราจะใช้คำสั่ง command:make ใน command line เพื่อสร้าง class ขึ้นมาก่อนครับ

ตัวอย่างการใช้ command line สร้างคำสั่ง

1 php artisan command:make FooCommand

ถ้าเราอยากจะเปลี่ยนที่อยู่ให้กับไฟล์คำสั่งของเรา ก็ใช้คำสั่งนี้ไปเลยครับ

1 php artisan command:make FooCommand --path="app/classes" --namespace="Classes"

การตั้งค่าคำสั่ง

เริ่มต้นโดยการตั้ง name และ description รวมถึงส่วนประกอบอื่นของคลาส, โดยค่าเหล่านี้จะไปปรากฏตอนคำสั่ง artisan list ฟังก์ชัน fire ใช้ในการเรียกฟังก์ชันต่างๆ ที่จะทำงานในคำสั่งนี้

การตั้งค่าต่างๆ

getArguments กับ getOptions เมทอด เป็นที่ๆ เราะทำการตั้งค่าจะต่างๆ ทั้ง พารามิเตอร์ที่ 1 ที่ 2 การตั้งค่าจะมีลักษณะการส่งค่าลงอาเรย์.

เมื่อเรา คำสั่งของเรามีการให้ป้อนพารามิเตอร์ ตัวของ array ต้องมีรูปแบบดังนี้

1 array($name, $mode, $description, $defaultValue)

ตัวแปร mode เรากำหนดให้เป็นแบบต้องมี InputArgument::REQUIRED หรือไม่มีก็ได้ InputArgument::OPTIONAL.

เมื่อเรากำหนดให้มีการใส่คำสั่งเพิ่มเติม ลักษณะอาเรย์จะเป็นแบบนี้

1 array($name, $shortcut, $mode, $description, $defaultValue)

ในการกำหนด mode ให้เป็นได้หลายๆแบบได้เช่น

InputOption::VALUE_REQUIRED, InputOption::VALUE_OPTIONAL, InputOption::VALUE_IS_ARRAY, InputOption::VALUE_NONE.

ตัวอย่างรูปแบบค่าที่ต้องป้อนให้เมื่อกำหนด mode เป็น VALUE_IS_ARRAY

1 php artisan foo --option=bar --option=baz

<br /><br /><br /><br /><br /> ### การเข้าถึงตัวแปร

เมื่อคำสั่งทำงาน เราก็ต้องมีตัวจัดการในการ ดึงค่าต่างๆ ในพารามิเตอร์ของการตั้งค่า ที่รับมา

การดึงค่าจากพารามิเตอร์เฉพาะตัว

1 $value = $this->argument('name');

การดึงค่าทั้งหมด

1 $arguments = $this->argument();

การรับค่าจากค่าการตั้งค่าแบบเฉพาะตัว

1 $value = $this->option('name');

การรับค่าจากค่าการตั้งค่าแบบทั้งหมด

1 $options = $this->option();

<br /><br /><br /><br /><br /><br /> ### การส่งผลการทำงาน

มีประเภทของคำสั่งที่จะแสดงออกทาง commandline 4 ประเภท คือ info , comment , question และ error ทั้ง 4 มีรูปบแบบ unicode เป็น ANSI

ส่งข้อมูลของคำสั่งออกทางหน้าจอ

1 $this->info('Display this on the screen');

ส่งข้อความออกไปทางหน้าจอ

1 $this->error('Something went wrong!');

ให้ผู้ใช้งานเลือก

เราสามารถใช้การถามคำถาม และ ยืนยัน เพื่อความรวดเร็วในการใช้งาน

การถามคำถาม

1 $name = $this->ask('What is your name?');

<br /><br /> การถามคำถามและค่าที่ป้อนมาเป็นรูปแบบ

1 $password = $this->secret('What is the password?');

ยืนยันการเลือก

1 if ($this->confirm('Do you wish to continue? [yes|no]'))
2 {
3 	//
4 }

เราสามารถกำหนดค่าเริ่มต้นของคำสั่ง confirm ให้เป็นtrue หรือ false ได้

1 $this->confirm($question, true);

<a name="registering-commands"></a> ## การลงทะเบียนคำสั่ง

เมื่อการสร้างคำสั่งเสร็จสิ้น เราต้องนำไปลงทะเบียนที่ไฟล์ app/start/artisan.php โดยใช้คำสั่ง Artisan::add เพื่อลงทะเบียน

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

1 Artisan::add(new CustomCommand);

ถ้าคำสั่งเราใช้ใน IoC container เราต้องใช้คำสั่ง Artisan::resolve เพื่อผูกคำสั่งของเราไปกับ IOC ด้วย

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

1 Artisan::resolve('binding.name');

<a name="calling-other-commands"></a> ## การเรียกใช้คำสั่งอื่นร่วม

บางเวลาเราต้องการจะเรียกใช้คำสั่งอื่นๆ สามารถใช้ฟังก์ชัน call เรียกได้

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

1 $this->call('command.name', array('argument' => 'foo', '--option' => 'bar'));

เราสามารถสร้างคำสั่ง artisan ขึ้นมาใช้โดยไฟล์จะเก็บที่โฟลเดอร์ app/commands ถ้าเราไม่อยากเก็บไว้ตรงนี้ก็ไปตั้งค่าที่ไฟล์ composer.json ได้

<a name="building-a-command"></a> ## การสร้างคำสั่ง

เริ่มสร้างคลาส

เราใช้คำสั่ง command:make ใน command line เพื่อสร้าง class ขึ้นมาก่อนครับ

ตัวอย่างการใช้ command line สร้างคำสั่ง

1 php artisan command:make FooCommand

ถ้าเราอยากจะเปลี่ยนที่อยู่ให้กับไฟล์คำสั่งของเรา ก็ใช้คำสั่งนี้ไปเลยครับ

1 php artisan command:make FooCommand --path="app/classes" --namespace="Classes"

เริ่มลงรายละเอียด

เริ่มต้นโดยการตั้ง name และ description รวมถึงส่วนประกอบอื่นของคลาส, โดยค่าเหล่านี้จะไปปรากฏตอนคำสั่ง artisan list. ฟังก์ชัน fire ใช้ในการเรียกฟังก์ชันต่างๆ ที่จะทำงานในคำสั่งนี้ ### การตั้งค่าต่างๆ

getArguments กับ getOptions เมทอด เป็นที่ๆ เราะทำการตั้งค่าจะต่างๆ ทั้ง พารามิเตอร์ที่ 1 ที่ 2 . การตั้งค่าจะมีลักษณะการส่งค่าลงอาเรย์.

เมื่อเรา คำสั่งของเรามีการให้ป้อนพารามิเตอร์ array ต้องมีรูปแบบดังนี้

1 array($name, $mode, $description, $defaultValue)

ตัวแปร mode เรากำหนดให้เป็นแบบต้องมี InputArgument::REQUIRED ไม่มีก็ได้ InputArgument::OPTIONAL.

เมื่อเรากำหนดให้มีการใส่คำสั่งเพิ่มเติมลักษณะอาเรย์จะเป็นแบบนี้

1 array($name, $shortcut, $mode, $description, $defaultValue)

ในการกำหนด mode ใหเป็นได้หลายๆแบบได้เช่น: InputOption::VALUE_REQUIRED, InputOption::VALUE_OPTIONAL, InputOption::VALUE_IS_ARRAY, InputOption::VALUE_NONE.

ตัวอย่างรูปแบบค่าที่ต้องป้อนให้เมื่อกำหนด mode เป็น VALUE_IS_ARRAY

1 php artisan foo --option=bar --option=baz

การเข้าถึงตัวแปร

เมื่อคำสั่งทำงาน เราก็ต้องมีตัวจัดการๆ ดึงค่าต่างๆ ในพารามิเตอร์ การตั้งค่า ที่รับมา

การดึงค่าจากพารามิเตอร์เฉพาะตัว

1 $value = $this->argument('name');

การดึงค่าทั้งหมด

1 $arguments = $this->argument();

การรับค่าแบบเฉพาะตัว

1 $value = $this->option('name');

การรับค่าแบบทั้งหมด

1 $options = $this->option();

ส่งผลการทำงาน

มีประเภทของคำสั่งที่จะแสดงออกทาง commandline 4 ประเภท คือ info , comment , question และ error ทั้ง 4 มีรูปบบ unicode เป็น ANSI

ส่งข้อมูลของคำสั่งออกทางหน้าจอ

1 $this->info('Display this on the screen');

ส่งเออเรอออกไปทางหน้าจอ

1 $this->error('Something went wrong!');

ให้ผู้ใช้งานเลือก

เราสามารถใช้การถามคำถาม และ ยืนยัน เพื่อความรวดเร็วในการใช้งาน

การถามคำถาม

1 $name = $this->ask('What is your name?');

**การถามคำถามและค่าที่ป้อนมาเป็นรูปแบบ ** **

1 $password = $this->secret('What is the password?');

Asking The User For Confirmation

1 if ($this->confirm('Do you wish to continue? [yes|no]'))
2 {
3 	//
4 }

เราสามารถกำหนดค่าเริ่มต้นให้คำสั่ง confirm ให้เป็นtrue หรือ false ได้

1 $this->confirm($question, true);

<a name="registering-commands"></a> ## การลงทะเบียนคำสั่ง

เมื่อการสร้างคำสั่งเสร็จสิ้น เราต้องนำไปลงทะเบียนที่ไฟล์ app/start/artisan.php โดยใช้คำสั่ง Artisan::add เพื่อลงทะเบียน

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

1 Artisan::add(new CustomCommand);

ถ้าคำสั่งเราใช้ใน IoC container,เราต้องใช้คำสั่งArtisan::resolve เพื่อมัดคำสั่งของเราไปกับ IOC ด้วย

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

1 Artisan::resolve('binding.name');

<a name="calling-other-commands"></a> ## การเรียกใช้คำสั่งอื่นร่วม

บางเวลาเราต้องการจะเรียกใช้คำสั่งอื่นๆ สามารถใช้ฟังก์ชัน call เรียกได้

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

1 $this->call('command.name', array('argument' => 'foo', '--option' => 'bar'));