Table of Contents
- แนะนำตัวกันก่อน
- Installation
- การเริ่มต้นอย่างรวดเร็ว
- การดึงค่าของการตั้งค่าหลักมาใช้
- Routing ( การจัดการเส้นทางด้วย url )
- การจัดการฐานข้อมูลเบื้องต้น
- Schema Builder ( คลาสเกี่ยวกับการสร้างตาราง )
- Query Builder ( ฟังก์ชันที่ใช้จัดการฐานข้อมูล )
- Eloquent ORM
- Forms & HTML
- IoC Container
- Mail ( การส่งเมล์ )
- Session ( คลาสที่ใช้จัดกาาร Session )
- Security ( คลาสที่เกี่ยวกับการเข้ารหัส )
- SSH ( คลาสทที่ใช้จัดการ ftp และ git)
- Responses ( คลาสที่ใช้จัดการส่งข้อมูลกลับ )
- Validation ( การตรวจสอบข้อมูล )
- Unit Testing
- Redis
- Localization ( การทำหลายภาษา )
- Cache
- Events
- Pagination ( การแบ่งการแสดงข้อมูล )
- Artisan ( การเรียกใช้งาน php ผ่านทาง cmd )
แนะนำตัวกันก่อน
<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
หนึ่งในทางเลือกที่ดีคือการศึกษาคู่มือการใช้งาน หรือซื้อหนังสือในนี้ครับ
- Code Bright by Dayle Rees
- Laravel Testing Decoded by Jeffrey Way
- Laravel From Aprentice to Artisan by Taylor Otwell
<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
- UserScape
- Cartalyst
- Elli Davis - Toronto Realtor
- Jay Banks - Vancouver Lofts & Condos
- Julie Kinnear - Toronto MLS
- Jamie Sarner - Toronto Real Estate
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 ก่อนครับ
- เริ่มจากไฟล์
index.phpครับ ช่วงที่เราตั้งค่าvhostเราจะตั้งให้เส้นทางที่เข้าถึงเริ่มแรก คือ/public/พอเริ่มเข้าถึงไฟล์index.phpทำการเรียกไฟล์autoload.phpจากโฟลเดอร์bootstrap - ในไฟล์
autoload.phpจะทำการตั้งค่าเวลาที่ตัวเว็บเริ่มทำงาน
- จากนั้นเราจะ เรียกไฟล์
autoload.phpจากโฟลเดอร์vendorขึ้นมา
- ที่เห็นชื่อยาวขนาดนี้เป็นเพราะถูกสุมมาจากการที่ใช้คำสั่ง
artisan dump autoloadเพื่อสร้าง รายชื่อของpackageใหม่นะครับ แต่ก่อนหน้านั้นเราจะทำการโหลดไฟล์packageทั้งหมดก่อน โดยเรียกไฟล์autoload_real.phpขึ้นมา
- ต่อมาใน ไฟล์
vendor/composer/autoload_real.phpจะทำการเรียกไฟล์Classloaderมาทำการสร้างเป็นวัตถุชื่อ$loaderแล้วก็
- เรียกไฟล์
autoload_classmapกับautoload_namespaceขึ้นมาซึ่งในไฟล์autoload_classmapจะเป็นรายชื่อของไฟล์packageทั้งหมดที่อยู่ในโฟลเดอร์vendorส่วนในไฟล์autoload_namespaceจะเป็นรายชื่อของตัวnamespaceที่ใช้เรียกroot pathของไฟล์packageนั้นครับ
- พอเรียกเสร็จก็จะส่งกลับมาที่ ไฟล์
autoloadแล้วก็ส่งค่าต่อไปให้ClassLoaderของlaravel
- ตามลงมาดูว่า
Classloaderของlaravelมันทำยังไงต่อนะครับ ฟังก์ชันregisterทำการเรียกใช้ ฟังก์ชันload
- ฟังก์ชัน
loadจะทำการเรียกโฟลเดอร์packageที่มีตามรายชื่อในตัวแปรclassที่ส่งมาตอนแรก
- เท่านี้ก็เสร็จการโหลด
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
- ขั้นตอนนี้จะเป็นการเริ่มสร้างตัวออปเจคหลักของ เว็บกันแล้วนะครับ
เริ่มจากไฟล์
bootstrap/start.phpเราจะดำดิ่งลงไปดูในคลาส ` Application ตรงคลาสนี้เป็นตัวหลักที่คอยขับเคลื่อนเว็บไซต์ของเราเลยครับ เพราะ มีการเรียกใช้ คลาสเข้ามาจำนวนมาก ฟังก์ชันในนี้ ผมจะไม่พยายามไปดูให้ตาลาย ให้รู้ว่าเรา มีฟังก์ชันที่เราต้องเข้าใจ คือApp::share,App::bind,App::instance,App::makeเราไปดูต่อว่าเริ่มมาตัวclass Application`ทำอะไรต่อ - เนื่องจาก ทำการเรียกตัวคลาสเข้ามาแล้ว จึงทำการสร้างวัตถุใหม่ได้ทันทีเลยครับ สิ่งที่ต้องสร้างก่อนสามอันดับแรกเลยก็คือ
Class Exceptionใช้ในการจัดการข้อผิดพลาดClass Routingจัดการๆวิ่งของคำร้องขอClass Eventจัดการเหตุการณ์ต่าง ที่เกิดขึ้น
- กลับมาที่ ไฟล์
start.phpครับ ขั้นต่อมา เราจะทำการตรวจสถานะการทำงานของระบบนะครับ ว่าอยู่ในโหมดไหน ตรงนี้มีประโยชน์มากในกรณีเมื่อเรากำลังพัฒนาอยู่ก็ตั้งให้เป็นdevelopmentส่วนจะไปกำหนดที่ไหนค่อยมาพูดกันอีกทีครับ
- ทำการโหลดไฟล์
path.phpซึ่งจะเป็นclassใช้ในการกำหนดเส้นทางการเข้าหาโฟลเดอร์ต่างๆ
- ทำการเรียกใช้งานตัว
laravelละครับตรงนี้จะเป็นการ เรียกไฟล์startของตัวlaravelขึ้นมา
ตอนที่ 3 Bootstrap
- laravel เริ่มการตรวจว่ามีการติตตั้ง
Mcryptไหม
- ต่อมาก็ตรวจสภาวะการตั้งค่าก่อนว่าเรากำลัง ตั้งให้อยู่ในสถานะการทอบสอบไหม
- คลาส
Facadeจะทำการเคลียร์ ตัวแทนของมัน แล้วก็สร้างขึ้นใหม่
- ทำการโหลดข้อมูลการตั้งค่าจากตัวแปร
$envขึ้นมาใส่ให้คลาสConfigครับ แล้วสร้างตัวแทนให้คลาสConfig
- ทำการตั้งค่าวันเวลาโดยโหลดค่ามาจากตัวแปรในไฟล์
app.php
- โหลดค่าชื่อย่อจากที่ไฟล์
app.phpมา
มาให้ฟังก์ชัน getInstance มาทำการลงทะเบียนไว้

- ทำการอนุญาตให้ใช้คำร้องขอชนิด
putใช้ทำการแก้ไขข้อมูล กับdeleteใช้ในการลบข้อมูล เพื่อใช้ตอนทำrestfulในกรณีที่firewallไม่อนุญาตุให้เมทอดสองอันนี้ผ่าน เราจึงจำเป็นต้องทำการเปลี่ยนส่วนหัวของเมทอดpostให้กลายเป็นสองเมทอดที่โดนบล็อก
- ทำการวมคลาสทุกตัวที่โหลดมาเข้าด้วยกัน
$config['providers']คือรายชื่อคลาสที่อยู่ในไฟล์app.php
- เรียกใช้ฟังก์ชัน
$app->boot()เพื่อเริ่มต้นการทำงาน เเล้วเรียกไฟล์global.phpซึ่งเป็นไฟล์ที่เราสามารถใช้กำหนดค่าเริ่มต้นเองได้
- รองสุดท้ายดึงไฟล์ที่เราใช้กำหนดสภาวะการตั้งค่าขึ้นมา
- สุดท้ายในบทนี้แล้วครับเรียกไฟล์
routes.phpจบตอนครับ
ตอนที่ 4 Run
ตอนสุดท้ายแล้วครับ เราใกล้ได้คำตอบกลับหรือ Response
- ทำการเขียน
session - ค้นหา
Routeที่ส่งมาว่าตรงกับตัวที่่กำหนดไว้ไหม - สั่งให้
filterเช่นbefore,afterทำงาน - สร้างคำตอบกลับหรือ
Response - ส่งคำตอบกลับ
- เรียกใช้
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(); ?>
เพียงแค่นี้ก็จะได้การแบ่งหน้าละครับ.
เราสามารถจัดการๆ แบ่งหน้าได้โดยฟังก์ชันต่อไปนี้ครับ:
getCurrentPagegetLastPagegetPerPagegetTotalgetFromgetTo
บางครั้งเราอยากสร้างเองเพราะอาจจะมีข้อมูลที่ต้องผ่านการคำนวนหลายขั้น ก็ใช้เมทอดนี้เลยครับ 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'));