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![](http://resource.thaicreate.com/upload/stock/20130718073801.png?v=1001) ตรงคลาสนี้เป็นตัวหลักที่คอยขับเคลื่อนเว็บไซต์ของเราเลยครับ เพราะ มีการเรียกใช้ คลาสเข้ามาจำนวนมาก ฟังก์ชันในนี้ ผมจะไม่พยายามไปดูให้ตาลาย ให้รู้ว่าเรา มีฟังก์ชันที่เราต้องเข้าใจ คือ
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
();
?>
เพียงแค่นี้ก็จะได้การแบ่งหน้าละครับ.
เราสามารถจัดการๆ แบ่งหน้าได้โดยฟังก์ชันต่อไปนี้ครับ:
getCurrentPage
getLastPage
getPerPage
getTotal
getFrom
getTo
บางครั้งเราอยากสร้างเองเพราะอาจจะมีข้อมูลที่ต้องผ่านการคำนวนหลายขั้น ก็ใช้เมทอดนี้เลยครับ Paginator::make
ตัวอย่าง
1
$
paginator
=
Paginator
::
make
(
$
items
,
$
totalItems
,
$
perPage
);
<a name="appending-to-pagination-links"></a> ## การสร้างลิ้งของการแบ่งหน้า
เราสามารทำการเรียงลำดับการแสดงผลได้โดยใช้เมทอด appends
เหมือนในตัวอย่าง
1
<?php
echo
$users
->
appends
(
array
(
'sort'
=>
'votes'
))
->
links
();
?>
ลิ้งที่ออกมาหน้าตาจะเป็นแบบนี้
1
http:
//example.com/something?page=2&sort=votes
ส่วนที่เพิ่มเข้ามาใน 4.1 จะเป็นการสร้างลิ้งแบ่งหน้าแบบ ajax ด้วยตัวอย่างนี้
1
<?php
echo
$users
->
fragment
(
'foo'
)
->
links
();
?>
เราจะได้ลิ้งแบบนี้มา
http://example.com/something?page=2#foo
ซึ่งเราสามารถประยุกต์ไปใช้ร่วมกับ ajax ได้
Artisan ( การเรียกใช้งาน php ผ่านทาง cmd )
<a name="introduction"></a> ## แนะนำ
Artisan
คือ ชุดคำสั่งที่ใช้เรียกงานผ่านทาง command line
เพื่อช่วยให้จัดการงานต่างให้ง่าย รวดเร็วขึ้น ซึ่ง laravel
นำ Class console
ของ symfony
มาปรับใช้
<a name="usage"></a> ## การใช้งาน
ในการเรียกดูคำสั่งทั้งหมดใช้คำสั่ง list
1
php
artisan
list
ทุกคำสั่งจะมีวิธีการใช้ให้เราดู โดยเพิ่ม parameter help
เข้าไปนะครับ
ตัวอย่างการใช้งาน help
1
php
artisan
help
migrate
เราสามารถเรียก พร้อมกับเปลี่ยนการตั้งค่าโดยรวมของเว็บโดยเพิ่มพารามิเตอร์ --env
ตัวอย่างนี้เราเรียกในการตั้งค่าแบบ local
1
php
artisan
migrate
--
env
=
local
จะเรียกดูรุ่นของ laravel ก็ได้โดยพารามิเตอร์ --version
1
php
artisan
--
version
<br /><br /><br /><br /><br /><br /> ## การสร้างคำสั่งขึ้นใช้งานเอง ##
เราสามารถสร้างคำสั่ง artisan
ขึ้นมาใช้ โดยไฟล์จะเก็บที่โฟลเดอร์ app/commands
ถ้าเราไม่อยากเก็บไว้ตรงนี้ก็ไปตั้งค่าที่ไฟล์ composer.json
ได้
<a name="building-a-command"></a> ## การสร้างคำสั่ง
เริ่มสร้างคลาส
เราจะใช้คำสั่ง command:make
ใน command line
เพื่อสร้าง class
ขึ้นมาก่อนครับ
ตัวอย่างการใช้ command line สร้างคำสั่ง
1
php
artisan
command
:
make
FooCommand
ถ้าเราอยากจะเปลี่ยนที่อยู่ให้กับไฟล์คำสั่งของเรา ก็ใช้คำสั่งนี้ไปเลยครับ
1
php
artisan
command
:
make
FooCommand
--
path
=
"app/classes"
--
namespace
=
"Classes"
การตั้งค่าคำสั่ง
เริ่มต้นโดยการตั้ง name
และ description
รวมถึงส่วนประกอบอื่นของคลาส, โดยค่าเหล่านี้จะไปปรากฏตอนคำสั่ง artisan list
ฟังก์ชัน fire
ใช้ในการเรียกฟังก์ชันต่างๆ ที่จะทำงานในคำสั่งนี้
การตั้งค่าต่างๆ
getArguments
กับ getOptions
เมทอด เป็นที่ๆ เราะทำการตั้งค่าจะต่างๆ ทั้ง พารามิเตอร์ที่ 1 ที่ 2 การตั้งค่าจะมีลักษณะการส่งค่าลงอาเรย์.
เมื่อเรา คำสั่งของเรามีการให้ป้อนพารามิเตอร์ ตัวของ array ต้องมีรูปแบบดังนี้
1
array
(
$
name
,
$
mode
,
$
description
,
$
defaultValue
)
ตัวแปร mode
เรากำหนดให้เป็นแบบต้องมี InputArgument::REQUIRED
หรือไม่มีก็ได้ InputArgument::OPTIONAL
.
เมื่อเรากำหนดให้มีการใส่คำสั่งเพิ่มเติม ลักษณะอาเรย์จะเป็นแบบนี้
1
array
(
$
name
,
$
shortcut
,
$
mode
,
$
description
,
$
defaultValue
)
ในการกำหนด mode
ให้เป็นได้หลายๆแบบได้เช่น
InputOption::VALUE_REQUIRED
, InputOption::VALUE_OPTIONAL
, InputOption::VALUE_IS_ARRAY
, InputOption::VALUE_NONE
.
ตัวอย่างรูปแบบค่าที่ต้องป้อนให้เมื่อกำหนด mode เป็น VALUE_IS_ARRAY
1
php
artisan
foo
--
option
=
bar
--
option
=
baz
<br /><br /><br /><br /><br /> ### การเข้าถึงตัวแปร
เมื่อคำสั่งทำงาน เราก็ต้องมีตัวจัดการในการ ดึงค่าต่างๆ ในพารามิเตอร์ของการตั้งค่า ที่รับมา
การดึงค่าจากพารามิเตอร์เฉพาะตัว
1
$
value
=
$
this
->
argument
(
'
name
'
);
การดึงค่าทั้งหมด
1
$
arguments
=
$
this
->
argument
();
การรับค่าจากค่าการตั้งค่าแบบเฉพาะตัว
1
$
value
=
$
this
->
option
(
'
name
'
);
การรับค่าจากค่าการตั้งค่าแบบทั้งหมด
1
$
options
=
$
this
->
option
();
<br /><br /><br /><br /><br /><br /> ### การส่งผลการทำงาน
มีประเภทของคำสั่งที่จะแสดงออกทาง commandline 4 ประเภท คือ info
, comment
, question
และ error
ทั้ง 4 มีรูปบแบบ unicode เป็น ANSI
ส่งข้อมูลของคำสั่งออกทางหน้าจอ
1
$
this
->
info
(
'
Display
this
on
the
screen
'
);
ส่งข้อความออกไปทางหน้าจอ
1
$
this
->
error
(
'
Something
went
wrong
!
'
);
ให้ผู้ใช้งานเลือก
เราสามารถใช้การถามคำถาม และ ยืนยัน เพื่อความรวดเร็วในการใช้งาน
การถามคำถาม
1
$
name
=
$
this
->
ask
(
'
What
is
your
name
?
'
);
<br /><br /> การถามคำถามและค่าที่ป้อนมาเป็นรูปแบบ
1
$
password
=
$
this
->
secret
(
'
What
is
the
password
?
'
);
ยืนยันการเลือก
1
if
(
$
this
->
confirm
(
'
Do
you
wish
to
continue
?
[
yes
|
no
]
'
))
2
{
3
//
4
}
เราสามารถกำหนดค่าเริ่มต้นของคำสั่ง confirm
ให้เป็นtrue
หรือ false
ได้
1
$
this
->
confirm
(
$
question
,
true
);
<a name="registering-commands"></a> ## การลงทะเบียนคำสั่ง
เมื่อการสร้างคำสั่งเสร็จสิ้น เราต้องนำไปลงทะเบียนที่ไฟล์ app/start/artisan.php
โดยใช้คำสั่ง Artisan::add
เพื่อลงทะเบียน
ตัวอย่างการใช้งาน
1
Artisan
::
add
(
new
CustomCommand
);
ถ้าคำสั่งเราใช้ใน IoC container เราต้องใช้คำสั่ง Artisan::resolve
เพื่อผูกคำสั่งของเราไปกับ IOC ด้วย
ตัวอย่างการใช้งาน
1
Artisan
::
resolve
(
'
binding
.
name
'
);
<a name="calling-other-commands"></a> ## การเรียกใช้คำสั่งอื่นร่วม
บางเวลาเราต้องการจะเรียกใช้คำสั่งอื่นๆ สามารถใช้ฟังก์ชัน call
เรียกได้
ตัวอย่างการใช้งาน
1
$
this
->
call
(
'
command
.
name
'
,
array
(
'
argument
'
=>
'
foo
'
,
'
--
option
'
=>
'
bar
'
));
เราสามารถสร้างคำสั่ง artisan ขึ้นมาใช้โดยไฟล์จะเก็บที่โฟลเดอร์ app/commands
ถ้าเราไม่อยากเก็บไว้ตรงนี้ก็ไปตั้งค่าที่ไฟล์ composer.json
ได้
<a name="building-a-command"></a> ## การสร้างคำสั่ง
เริ่มสร้างคลาส
เราใช้คำสั่ง command:make
ใน command line เพื่อสร้าง class ขึ้นมาก่อนครับ
ตัวอย่างการใช้ command line สร้างคำสั่ง
1
php
artisan
command
:
make
FooCommand
ถ้าเราอยากจะเปลี่ยนที่อยู่ให้กับไฟล์คำสั่งของเรา ก็ใช้คำสั่งนี้ไปเลยครับ
1
php
artisan
command
:
make
FooCommand
--
path
=
"app/classes"
--
namespace
=
"Classes"
เริ่มลงรายละเอียด
เริ่มต้นโดยการตั้ง name
และ description
รวมถึงส่วนประกอบอื่นของคลาส, โดยค่าเหล่านี้จะไปปรากฏตอนคำสั่ง artisan list
.
ฟังก์ชัน fire
ใช้ในการเรียกฟังก์ชันต่างๆ ที่จะทำงานในคำสั่งนี้
### การตั้งค่าต่างๆ
getArguments
กับ getOptions
เมทอด เป็นที่ๆ เราะทำการตั้งค่าจะต่างๆ ทั้ง พารามิเตอร์ที่ 1 ที่ 2 . การตั้งค่าจะมีลักษณะการส่งค่าลงอาเรย์.
เมื่อเรา คำสั่งของเรามีการให้ป้อนพารามิเตอร์ array ต้องมีรูปแบบดังนี้
1
array
(
$
name
,
$
mode
,
$
description
,
$
defaultValue
)
ตัวแปร mode เรากำหนดให้เป็นแบบต้องมี InputArgument::REQUIRED
ไม่มีก็ได้ InputArgument::OPTIONAL
.
เมื่อเรากำหนดให้มีการใส่คำสั่งเพิ่มเติมลักษณะอาเรย์จะเป็นแบบนี้
1
array
(
$
name
,
$
shortcut
,
$
mode
,
$
description
,
$
defaultValue
)
ในการกำหนด mode
ใหเป็นได้หลายๆแบบได้เช่น: InputOption::VALUE_REQUIRED
, InputOption::VALUE_OPTIONAL
, InputOption::VALUE_IS_ARRAY
, InputOption::VALUE_NONE
.
ตัวอย่างรูปแบบค่าที่ต้องป้อนให้เมื่อกำหนด mode เป็น VALUE_IS_ARRAY
1
php
artisan
foo
--
option
=
bar
--
option
=
baz
การเข้าถึงตัวแปร
เมื่อคำสั่งทำงาน เราก็ต้องมีตัวจัดการๆ ดึงค่าต่างๆ ในพารามิเตอร์ การตั้งค่า ที่รับมา
การดึงค่าจากพารามิเตอร์เฉพาะตัว
1
$
value
=
$
this
->
argument
(
'
name
'
);
การดึงค่าทั้งหมด
1
$
arguments
=
$
this
->
argument
();
การรับค่าแบบเฉพาะตัว
1
$
value
=
$
this
->
option
(
'
name
'
);
การรับค่าแบบทั้งหมด
1
$
options
=
$
this
->
option
();
ส่งผลการทำงาน
มีประเภทของคำสั่งที่จะแสดงออกทาง commandline 4 ประเภท คือ info
, comment
, question
และ error
ทั้ง 4 มีรูปบบ unicode เป็น ANSI
ส่งข้อมูลของคำสั่งออกทางหน้าจอ
1
$
this
->
info
(
'
Display
this
on
the
screen
'
);
ส่งเออเรอออกไปทางหน้าจอ
1
$
this
->
error
(
'
Something
went
wrong
!
'
);
ให้ผู้ใช้งานเลือก
เราสามารถใช้การถามคำถาม และ ยืนยัน เพื่อความรวดเร็วในการใช้งาน
การถามคำถาม
1
$
name
=
$
this
->
ask
(
'
What
is
your
name
?
'
);
**การถามคำถามและค่าที่ป้อนมาเป็นรูปแบบ ** **
1
$
password
=
$
this
->
secret
(
'
What
is
the
password
?
'
);
Asking The User For Confirmation
1
if
(
$
this
->
confirm
(
'
Do
you
wish
to
continue
?
[
yes
|
no
]
'
))
2
{
3
//
4
}
เราสามารถกำหนดค่าเริ่มต้นให้คำสั่ง confirm
ให้เป็นtrue
หรือ false
ได้
1
$
this
->
confirm
(
$
question
,
true
);
<a name="registering-commands"></a> ## การลงทะเบียนคำสั่ง
เมื่อการสร้างคำสั่งเสร็จสิ้น เราต้องนำไปลงทะเบียนที่ไฟล์ app/start/artisan.php
โดยใช้คำสั่ง Artisan::add
เพื่อลงทะเบียน
ตัวอย่างการใช้งาน
1
Artisan
::
add
(
new
CustomCommand
);
ถ้าคำสั่งเราใช้ใน IoC container,เราต้องใช้คำสั่งArtisan::resolve
เพื่อมัดคำสั่งของเราไปกับ IOC ด้วย
ตัวอย่างการใช้งาน
1
Artisan
::
resolve
(
'
binding
.
name
'
);
<a name="calling-other-commands"></a> ## การเรียกใช้คำสั่งอื่นร่วม
บางเวลาเราต้องการจะเรียกใช้คำสั่งอื่นๆ สามารถใช้ฟังก์ชัน call
เรียกได้
ตัวอย่างการใช้งาน
1
$
this
->
call
(
'
command
.
name
'
,
array
(
'
argument
'
=>
'
foo
'
,
'
--
option
'
=>
'
bar
'
));