คู่มือใช้งาน laravel 4 1 ฉบับแปล
DESCRIPTION
เหมาะสำหรับผู้เริ่มต้น หรือ ยังไม่แน่ใจว่า laravel เหมาะสมกับตัวเองหรือไม่TRANSCRIPT
คคคมมอการใชชงาน Laravel PHP Framework 4.1
www.laraveltut.com เรยนร laravel แบบเจาะลก
1
www.laravetut.com เรยนร laravel แบบเจาะลก
จากผรร เขทยน
สทาหรกบ คนททท เรรทมตรนจกบ php framework เปวนครกนงแรก laravel เปวน frame work ทททเหมาะสมกกบ งานขนาดกลาง และเลวก ดรวยความททท โครดอลานงลาย เพทยงแคลตกนงชอทอ คลาส และ เมทอด ใหรสอทอความหมาย ตอนนทนผมกวเชอทอวลา laravel คงเขราไปอยรล ในใจ คนทททอลาน ebook เลลมนทนอยรลแลรว ใชลไหมครกบ
ถราทลานใดตรองการนทา ไปพรมพพ เพอทอแจกจลาย สามารถนทาไปปรรนนไดรทททนทน เลยครกบ
http://laraveltut.com/go/printing-in-th
ขอบคสณครกบ
2
www.laravetut.com เรยนร laravel แบบเจาะลก
สารบกญการตรดตกนง..................................................................................................................1การเรรทมตรนอยลางรวดเรวว …........................................................................................3Routing …...............................................................................................................7Controller..............................................................................................................14View........................................................................................................................19การจกดการฐานขรอมรลเบอนองตรน …............................................................................22การททาประวกตรฐานขรอมรล …....................................................................................25Schema …..............................................................................................................28Model & Eloquent...............................................................................................34Query Builder.......................................................................................................61Form & HTML …................................................................................................69Blade Template …...............................................................................................74Error & Logging …..............................................................................................78Artisan …..............................................................................................................81Event......................................................................................................................86Facade …...............................................................................................................90Helper....................................................................................................................93IOC.......................................................................................................................103Pagination............................................................................................................108Queue...................................................................................................................110Request................................................................................................................115Response............................................................................................................119
3
www.laravetut.com เรยนร laravel แบบเจาะลก
Security...............................................................................................................122Session................................................................................................................129SSH.....................................................................................................................132Unit Testing......................................................................................................135Validation...........................................................................................................139การจกดการภาษา...................................................................................................149การจกดการเมลพ ….................................................................................................152การดขงการตกนงคลามาใชร …........................................................................................155การสรราง package …............................................................................................158
4
www.laravetut.com เรยนร laravel แบบเจาะลก
การตดตง laravel
Install ComposerLaravel ใช Composer ในการจดการไลบราลตางๆ รวมจนถงคลาสหลกของระบบ เรมแรกเราตองไปโหลด composer.phar.เราจะไดไฟลทมนามสกลเปน phar มาแลวเอาไปวางไวท usr/local/bin เพอใหระบบมองเหน บนวนโดเราม Windows installerอยากรเพมเตมเขาไปดได ผมไดทาการสรปไว
การตดตง Laravel
ใช Composer ในการตดตง
พมพคาสงขางลางไปท commandline composer จะทาการดาวนโหลดมาลงตรงทเราเรยกใช
composer create-project laravel/laravel project-name
ดาวนโหลดเอง
เมอตดตง laravel เวอรชนลาสด แลวกแตกไฟลไปลงทโฟลเดอรของ server เปด command line เลอกทอยใหตรงกบทเอา laravel ไปวางแลวรนคาสงphp composer.phar install (หรอ composer install) กเสรจสน
ถาเราตองการอพเดทกใชคาสง php composer.phar update
ความตองการของระบบ
PHP >= 5.3.7MCrypt PHP Extension
การตงคาlaravel ไมไดตองการปรบแตงอะไรมากเพยงแคเราเขาไปท app/config/app.php โดยอาจปรบแค timezone กบ locale
Note: และมคา key ทอยใน app/config/app.php . เราตองใชคาสง php artisan key:generate เพอสรางคยทจะใชสราง private keyในการสรางรหสผาน hash ในระบบ
Installation5
www.laravetut.com เรยนร laravel แบบเจาะลก
สทธ
laravel ตองการสทธในการอานเขยนโฟลเดอร app/storage
เสนทาง
การกาหนดเสนทางสามารถทาไดท bootstrap/paths.php
URLs ทสวยงามlaravel เตรยมไฟล public/.htaccess ทอนญาตใหเราเรยกใชงานโดยไมตองใส index.php. โดยตองการใชงานขอ mod_rewrite บน server กอน
6
www.laravetut.com เรยนร laravel แบบเจาะลก
การเรมตนอยางรวดเรวหมายเหต :: url ทเราจะเรยกใชงานในตอนเรมแรกคอ localhost หรอ 127.0.0.1ตามดวยชอโฟลเดอรของเวบทเราสราง แลวตามดวย public นะครบ ยกตวอยาง 127.0.0.1/taqmaninw/public นะครบ
บททนจะทาใหเราเหนภาพรวมของ laravel นะครบ
การตดตงถาไมรจก composer แนะนาไปอาน ทน กอน เรมจากใชคาสง
composer create-project laravel/laravel projectname --prefer-dist
หลงจากนน composer จะทาการดาวนโหลดไฟลตางๆ มาเกบทโฟลเดอรทเรากาหนดชอไว
หลงจากนนกทาความรจกกบ โครงสรางโฟลเดอรของ laravel เรมแรกเราตองไปกาหนดคาตางๆ ทโฟลเดอร app/configกอนในนกจะมการตงคาใหมากมายแตเราอาจตองการแค
Routing ( การจดการเสนทาง )เราตองกาหนด url ทเราจะอนญาตใหเขาถง ฟงกชนตางกอนท app/routes.php ตวอยางการสราง Route เบองตน
Route::get('users', function(){ return 'Users!';});
ตอนนเมอเราพมพชอโปรเจคของเราบนบราวเซอรแลวตามดวย /users เราจะเหนคาวา Users! แสดงอย
การสราง Route ไปหา Controller
Route::get('users', 'UserController@getIndex');
ตอนน /user จะถกสงไปทฟงกชน getIndex ของ UserController
7
www.laravetut.com เรยนร laravel แบบเจาะลก
การสราง Viewตอมาเรามาสรางไฟลทจะใชจดการรปแบบในการแสดงผลทโฟลเดอร app/views เราสรางไฟลทชอ layout.blade.php และusers.blade.phpตอดวย layout.blade.php
<html> <body> <h1>Laravel Quickstart</h1>
@yield('content') </body></html>
ตอมาในไฟล users.blade.php เราจะดงไฟล layout มาลง
@extends('layout')
@section('content') Users!@stop
เพอความไมงงวาตวแปรเหลานคออะไร ตามไปอานเรอง template เลยครบ
ถาเราจะแสดงไฟล view ทเราสรางกตองอาศย Route ดงตวอยาง
Route::get('users', function(){ return View::make('users');});
ตอไปเราจะไปลยดาตาเบสกนนะครบ
การทา Migrationเราจะใชคลาส Migration ในการจดการฐานขอมลนะครบเรมตนดวยการตงคาในการเชอมตอฐานขอมลกอนทไฟล app/database ในคาเรมตนเเลวอาเรย driverจะเปน mysql แลวเรากเปลยนคาตรง mysqlเปนขอมลในการเชอมตอฐานขอมลของเรา
8
www.laravetut.com เรยนร laravel แบบเจาะลก
ตอมาในการสราง migration เราใช คาสง artisan ใน commandline จากในโฟลเดอรโปรเจคของเรา ตวอยาง
php artisan migrate:make create_users_table
ตอมาไฟล migrration จะไปโผลทโฟลเดอร app/database/migrations ในไฟลจะมฟงกชร up และ down เราจะสราง Schemaเพอการจดการฐานขอมล
ตวอยางการสราง Schema
public function up(){ Schema::create('users', function($table) { $table->increments('id'); $table->string('email')->unique(); $table->string('name'); $table->timestamps(); });}
public function down(){ Schema::drop('users');}
ตอมาเรากรนคาสง
php artisan migrate
ถาอยากยอนคาสง migrate เราตองใชคาสง migrate:rollback
Eloquent ORMEloquent คอ ชดคาสงทเราใชในการทา sql query นนเองครบ ชวยใหเราสะดวกสะบาย ทางานไดรวดเรวขน เรมแรกเราตองไปสราง model ทโฟลเดอรapp/models โดยตงชอวา User.php ตวอยางการประกาศคลาสในโมเดล
class User extends Eloquent {}
9
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยางการเรยกใช Eloquent Model ครบ
Route::get('users', function(){ $users = User::all();
return View::make('users')->with('users', $users);});
เมทอด allทตอจากเนมสเปซ User จะควรคาทงหมดจากตาราง users สวนใน View เราใชฟงกชน with เพอดงเฉพาะคอลมน user ครบ
Displaying Dataตวอยางการแสดงคาทมาจากฐานขอมลบนไฟล view ครบ
@extends('layout')
@section('content') @foreach($users as $user) <p>{{ $user->name }}</p> @endforeach@stop
ตอไปเราตองไปเรยนรเรอง Eloquent และ Blade หรอแวะเขาไปอานเลนๆ กอนทเรอง Queues และ Unit Testing.ถาตองการใชงานในระดบสงตอกไปท IoC Container
10
www.laravetut.com เรยนร laravel แบบเจาะลก
Routing ( การจดการเสนทางดวย url )ใชในการกาหนดวาเมอเราเรยกลงนจะใหทาอะไรขนบาง
Basic Routingในการตงคาเราจะไปท app/routes.php โดยรปแบบของฟงกชนทเปน Route จะเปนแบบ Closure callback Closure คออะไรตามไปตามเขาไปอานทนครบ
การรบคาทเปน get
Route::get('/', function(){ return 'Hello World';});
การรบคาทเปน POST
Route::post('foo/bar', function(){ return 'Hello World';});
การรบคาไดหลายเเบบ
เวอรชน 4.1 ไดเพมเมทอด match เพอชวยใหเราไมตองเขยน route get หรอ postสองตว เพอรบคาจาก route ชอเดยวกน
Route::match(array('GET', 'POST'), '/', function(){ return 'Hello World';});
กาหนด route ในการเรยกพารามเตอร foo ในทกรปแบบเมทอด
Route::any('foo', function(){ return 'Hello World';});
11
www.laravetut.com เรยนร laravel แบบเจาะลก
ลงทเรยกมาตองเปน https เทานน
Route::get('foo', array('https', function(){ return 'Must be over HTTPS';}));
Route Parametersตวอยางการกาหนดรปแบบของพารามเตอร
Route::get('user/{id}', function($id){ return 'User '.$id;});
พารามเตอรแบบมหรอไมมกได
Route::get('user/{name?}', function($name = null){ return $name;});
กาหนดพารามเตอรแบบตายตว
Route::get('user/{name?}', function($name = 'John'){ return $name;});
การใช regex ตรวจสอบวาพารามเตอรตรงกบทกาหนดไวไหม
Route::get('user/{name}', function($name){})->where('name', '[A-Za-z]+');
Route::get('user/{id}', function($id){ //})->where('id', '[0-9]+');
12
www.laravetut.com เรยนร laravel แบบเจาะลก
จะใสไปเปนอาเรยกได
Route::get('user/{id}/{name}', function($id, $name){ //})->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))
Route Filtersคอการกาหนดฟงกชนทใชในการตรวจสอบขอมล auth ใชตรวจวามการลอกอนไหม, guest ตรวจวายงไมไดลอกอน, และ csrfตรวจวาเปนการทา csrfไหม.ซงเราจะไปประกาศไวท app/filters.php
ตวอยางการสราง filter
Route::filter('old', function(){ if (Input::get('age') < 200) { return Redirect::to('home'); }});
การใส filter ให route
Route::get('user', array('before' => 'old', function(){ return 'You are over 200 years old!';}));
13
www.laravetut.com เรยนร laravel แบบเจาะลก
การใส route หลายตว
Route::get('user', array('before' => 'auth|old', function(){ return 'You are authenticated and over 200 years old!';}));
การกาหนดคาเฉพาะให filter
Route::filter('age', function($route, $request, $value){ //});
Route::get('user', array('before' => 'age:200', function(){ return 'Hello World';}));
filter บางตวเราสงใหทางานหลงจากท route ทางานไปแลวเราตองกาหนดตวแปร $response เพอกาหนดคาทจะสงไปใหตวฟงกชนดวย
Route::filter('log', function($route, $request, $response, $value){ //});
การกรองแบบมรปแบบ
เราสามารถกาหนด filter ใหทางานเฉพาะเมอมการเรยกตรงกบทเรากาหนดได ตามตวอยางเลยครบ.
Route::filter('admin', function(){ //});
Route::when('admin/*', 'admin');
ตามตวอยางเราเพม filter ชอ admin เขากบทกลงทม admin/ อยขางใน
14
www.laravetut.com เรยนร laravel แบบเจาะลก
แลวกยงสามารถกาหนดเมทอดใหไดดวย
Route::when('admin/*', 'admin', array('post'));
Filter Classes
ในการกรองขนสงเราสามารถสรางคลาสขนมาไดเอง แลวทาการใช IoC Container เรยกใชคลาสนน
ตวอยางคลาส
class FooFilter {
public function filter() { // Filter logic... }
}
ลงทะเบยนคลาสโดยใหชอทจะนาไปใชวา foo
Route::filter('foo', 'FooFilter');
Named Routesคอการตงชอยอใหกบ route:
Route::get('user/profile', array('as' => 'profile', function(){ //}));
กาหนดใหชอยอนจะใช controller ไหน
Route::get('user/profile', array('as' => 'profile', 'uses' => 'UserController@showProfile'));
ตอนนเราใชชอยอ เพอสรางลงไดเเลว
$url = URL::route('profile');
$redirect = Redirect::route('profile');
15
www.laravetut.com เรยนร laravel แบบเจาะลก
เราใชเมทอดcurrentRouteName เพอดงชอของ Route ททางานในขณะนได
$name = Route::currentRouteName();
Route Groupsเราสามารถกาหนดกลมให Route ไดทาใหสะดวกมากขน
Route::group(array('before' => 'auth'), function(){ Route::get('/', function() { // Has Auth Filter });
Route::get('user/profile', function() { // Has Auth Filter });});
Sub-Domain Routingการสราง Route ใหกบโดนเมนยอย
Route::group(array('domain' => '{account}.myapp.com'), function(){
Route::get('user/{id}', function($account, $id) { // });
});
Route Prefixingในการกาหนดคาทใชกาหนดกลมของ เราใช prefix ในการตรวจสอบ
ตวอยางการใช prefix
16
www.laravetut.com เรยนร laravel แบบเจาะลก
Route::group(array('prefix' => 'admin'), function(){
Route::get('user', function() { // });
});
Route Model Bindingคอการผกโมเดลเขาไปกบ Route โดยใชเมทอด Route::model
การใชงาน
Route::model('user', 'User');
Route::get('profile/{user}', function(User $user){ //});
เรากจะทาการแทรก User instance เขาไปใน Route ยกตวอยาง profile/1 ถกเรยก User instance กจะม ID = 1.
ถาพารามเตอรทสงเขามาไมตรงกบ model ใดๆเราสามารถกาหนดการแสดงขอผดพลาดาได
Route::model('user', 'User', function(){ throw new NotFoundException;});
ตอมา เมทอด Route::bind เปนการผกพารามเตอรเขากบ โมเดล เมอมการสงคาเขาตรงกบ route ทกาหนดคากจะกจะถกสงมาทเมทอดนกอน
Route::bind('user', function($value, $route){ return User::where('name', $value)->first();});
ตอมากกาหนดใหเมอมการเรยกลงทม {user}เปนพารามเตอร
17
www.laravetut.com เรยนร laravel แบบเจาะลก
Controllers
การทางานเบองตนแทนทเราจะวางฟงกชนไวทไฟล routes.php ควรเขยนลงไปท controller ดกวาครบ จะทาใหโคดมระเบยบเรยบรอย อานงาย
เราจะสราง Controllers ไวทโฟลเดอร app/controllers โฟลเดอรนจะถกกาหนดทอยไวในตวแปร classmap ในไฟล composer.json โดยเรมตน .
ตวอยางการเรยกใช controller:
class UserController extends BaseController {
public function showProfile($id) { $user = User::find($id);
return View::make('user.profile', array('user' => $user)); }
}
ทก controller จะสบทอดคลาส BaseController จะเกบไวทโฟลเดอร app/controllersโดยคลาส BaseController กสบทอดตอมาจากController ตอไปคอตวอยางการลงทะเบยน controller ไวท route ครบ
Route::get('user/{id}', 'UserController@showProfile');
ตวอยางนเปนการเรยกใชงาน controller แบบใช namespace นะครบ
Route::get('foo', 'Namespace\FooController@method');
เราสามารถตงชอยอใหเพอสะดวกตอการใชงาน ตามตวอยางขางลางเลยครบ
Route::get('foo', array('uses' => 'FooController@method','as' => 'name'));
18
www.laravetut.com เรยนร laravel แบบเจาะลก
จะสรางลงไปท controller กใชฟงกชน URL::action
$url = URL::action('FooController@method');
ใชฟงกชน currentRouteAction เพอเรยกคารองขอทผานมา
$action = Route::currentRouteAction();
Controller Filtersคอการกรองคา ทสงเขามายงตวเวบซง laravel กมรปแแบบการทา filter ไวใหอยแลวเหมอนในตวอยางคอ เมอเวบเรมทางานกตรวจวาไดลงชอเขาใชงานไหม แลวคาทสงมาปลอดภยไหม สงเครองหมายแปลกประหลาดมาไหม โดยทาการตรวจดวย filter ชอ csrfแลวถามการเรยก fooAction กบ barAction กทาการเกบ log ไวดวย
class UserController extends BaseController {
/** * */ public function __construct() { $this->beforeFilter('auth');
$this->beforeFilter('csrf', array('on' => 'post'));
$this->afterFilter('log', array('only' => array('fooAction', 'barAction'))); }
}
19
www.laravetut.com เรยนร laravel แบบเจาะลก
เราสามารถจบกลมใหตวกรองได เหมอนในตวอยางนะครบ
class UserController extends BaseController {
/** * Instantiate a new UserController instance. */ public function __construct() { $this->beforeFilter(function() { // }); }
}
RESTful Controllersrestful controller ของ laravel คอการกาหนดวาเมอมการสงคาขอแบบนไปทฟงกชนนใหตอบสนองแบบไหนนะครบ เปนการกรองตามชนดของคารองทง get,post,put,delete การกรองระดบชนดของคารองขอ ทาใหเราจดการไดงายขน
การกาหนดคา restful controller ใน route
Route::controller('users', 'UserController');
เมอเรากาหนด ดงตวอยางดานบนแลว คลาส UserController กจะรบแคคาทเรากาหนดโดยเราจะใสชนดของคารองขอทเราจะรบไวทหนาตวฟงกชน
class UserController extends BaseController {
public function getIndex() { // }
public function postProfile() { // }
}
20
www.laravetut.com เรยนร laravel แบบเจาะลก
ในกรณทชอฟงชนเรามหลายคาใชเครองหมาย - เพอเรยกไดดงตวอยางเราเรยกใชฟงกชน adminprofile ซงมสองคาusers/admin-profile
public function getAdminProfile() {}
Resource ControllersResource controllers คอการลงทะเบยน restful controller ของเรากบ Route มคาสงใน command line ทชวยใหเราสราง restful controllerไดรวดรวขน. ตวอยาง เราอยากจะสราง controller เพอจดการภาพเรากใชคาสง controller:make ตามตวอยาง
php artisan controller:make PhotoController
แลวกลงทะเบยนบอก route วา controller นเปน restful
Route::resource('photo', 'PhotoController');
การใชคาสงอตโนมตสรางจะทาใหเราได restful controller แบบเตมรปแบบ ยงเปนการสรางตวอยางการใชงาน restful ใหดวย
รปแบบของ restful controller ทคาสง artisan จะสรางให
Verb Path Action Route Name
GET /resource index resource.index
GET /resource/create create resource.create
POST /resource store resource.store
GET /resource/{id} show resource.show
GET /resource/{id}/edit edit resource.edit
PUT/PATCH /resource/{id} update resource.update
DELETE /resource/{id} destroy resource.destroy
21
www.laravetut.com เรยนร laravel แบบเจาะลก
ถาเราไมตองการสรางทงหมดตามในตารางกกาหนดเปนรายตวไปเลยครบ ดงตวอยาง
php artisan controller:make PhotoController --only=index,show
php artisan controller:make PhotoController --except=index
แลวกกาหนดคาใน route ใหใชงานไดเฉพาะฟงกชนกได
Route::resource('photo', 'PhotoController', array('only' => array('index', 'show')));
การจดการเมอหาฟงกชนไมเจอเราจะใชฟงกชน missingMethodเพอจดการครบ
ตวอยาง
public function missingMethod($parameters){ //}
22
www.laravetut.com เรยนร laravel แบบเจาะลก
ViewsViews คอสวนทใชเกบไฟลทใชสรางหนา html นะครบจะถกเกบไวทโฟลเดอร app/viewsตวอยาง view
<!-- View stored in app/views/greeting.php -->
<html> <body> <h1>Hello, <?php echo $name; ?></h1> </body></html>
การใชงาน view เบองตนครบ
Route::get('/', function(){ return View::make('greeting', array('name' => 'Taylor'));});
สงคาไปท view ครบ
$view = View::make('greeting', $data);
$view = View::make('greeting')->with('name', 'Steve');
ในตวอยางตวแปร $nameจะถกใชงานบน View ได
You may also share a piece of data across all views:
View::share('name', 'Steve');
23
www.laravetut.com เรยนร laravel แบบเจาะลก
การสง view แทรกเขาไปในอก view หนงครบ
เราสรางโฟลเดอรขนมาเกบ view ทเราจะทาเปน view ยอยกอนตวอยาง app/views/child/view.php ตวอยางการใชงาน
$view = View::make('greeting')->nest('child', 'child.view');
$view = View::make('greeting')->nest('child', 'child.view', $data);
ผลทออกมาครบ
<html> <body> <h1>Hello!</h1> <?php echo $child; ?> </body></html>
View ComposersView composers คอเมทอดทชวยเราในการจดการคาทเราตองแสดง ในทกหนาของ viewลดการเขยนโคดซ าซอน
ตวอยางการใชงาน
View::composer('profile', function($view){ $view->with('count', User::count());});
ตอนนทกครงท profile view ถกสราง count จะถกสงขนไปดวย
เราสามารถสงขนไปทละหลายๆ view ได
View::composer(array('profile','dashboard'), function($view){ $view->with('count', User::count());});
24
www.laravetut.com เรยนร laravel แบบเจาะลก
ถาเราตองการทาใหเปนคลาสเพองายตอการจดกลม เราตองทาแบบนครบ
View::composer('profile', 'ProfileComposer');
สรางคลาสขนมา
class ProfileComposer {
public function compose($view) { $view->with('count', User::count()); }
}
แลวอยาลมเพมเขาไปทไฟล composer.json
25
www.laravetut.com เรยนร laravel แบบเจาะลก
การจดการฐานขอมลเบองตน
การตงคาเราจะไปตงคาท app/config/database.php. ซงเราจะไปตงคาการเชอมตอขางในนครบ
laravel ในขณะนสนบสนน: MySQL, Postgres, SQLite, and SQL Server.
การกาหนดวาจะให database ตวไหนอานหรอเขยนในตวอยางน เราจะทาการโหลดบาลานซ โดยแบงให database ตวหนงทาหนาทอานขอมล และอกตวหนงทาหนาทเขยนขอมลอยางเดยว
'mysql' => array( 'read' => array( 'host' => '192.168.1.1', ), 'write' => array( 'host' => '196.168.1.2' ), 'driver' => 'mysql', 'database' => 'database', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '',),
การทา Queriesเราใชคลาส DB ในการเรยกใชการควรนะครบ
ตวอยางการควร
$results = DB::select('select * from users where id = ?', array(1));
ฟงกชนselectจะสงคาเปน arrayกลบมาเสมอ
26
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยางการเพมขอมล
DB::insert('insert into users (id, name) values (?, ?)', array(1, 'Dayle'));
ตวอยางการแกไขขอมล
DB::update('update users set votes = 100 where name = ?', array('John'));
ตวอยางการลบขอมล
DB::delete('delete from users');
หมายเหต: คาสง update กบ delete จะคนคาเปนจานวนของแถวทไดทาการจดการไป.
ตวอยางการใชคาสงทวไป
DB::statement('drop table users');
เราสามารถกาหนดใหฟงกชนนทางานเมอมการควรเกดขนโดยใชฟงกชน DB::listen
ตวอยางการใชงาน
DB::listen(function($sql, $bindings, $time){ //});
Database Transactionsเมอเราจะทาการควรหลายๆ คาสงเราจะใชฟงกชน transaction ในการควบคม เหมอนในตวอยางขางลาง
DB::transaction(function(){ DB::table('users')->update(array('votes' => 1));
DB::table('posts')->delete();});
27
www.laravetut.com เรยนร laravel แบบเจาะลก
การเขาถงการเชอมตอฐานขอมลสมมตเวบของเราใชฐานขอมลหลายชนด สามารถใชฟงกชน DB::connection ในการเรยกฐานขอมล เฉพาะทเราตองการดงตวอยาง
$users = DB::connection('foo')->select(...);
แลวกสามารถเชอมตอใหมดวยคาสง reconnect
DB::reconnect('foo');
การเกบประวตการควร โดยคาเรมตน laravel จะเกบประวตไวในหนวยความจาอยเเลว ในกรณทเวบของเรามคารองขอจานวนมาก การเกบประวตจะใชหนวยความจามากเราจะใชฟงกชน disableQueryLog เพอทาการหยดเกบประวต ตวอยาง
DB::connection()->disableQueryLog();
การแสดง query logหลายครง เราอยากรวา laravel กาลงใชรนควรตวไหน ในครงลาสด เราสามารถใชงาน
$queries = DB::getQueryLog();
เพอเรยกดได
28
www.laravetut.com เรยนร laravel แบบเจาะลก
Migrations & Seeding ( การทาประวตฐานขอมลและการจาลองขอมล )
คาอธบายเบองตนMigrations คอการเกบประวตสรางจดเซฟของฐานขอมล. ทาใหเราสามารถเพมลบตาราง โดยยอนกลบไดหากไมถกใจสวนการเขยนตารางตองไปดเรอง Schema Builder การทา migration จะเปนการควบคมการทางานของ schema.
สราง Migrationsเรมดวยการรนคาสง migrate:make บน commandline:
การสรางตารางโดยใช commandline
php artisan migrate:make create_users_table
ไฟล migration ถกเกบไวทโฟลเดอร app/database/migrations แตละไฟลจะมวนกากบชอ ดวยเพอใหระบบรลาดบการสรางไฟล
เราสามารถกาหนดทอยของไฟลไดโดยพารามเตอร --path เหมอนตวอยางขางลางครบ
php artisan migrate:make foo --path=app/migrations
พารามเตอร --table และ --create ใชในการสราง ตารางทงคเลยครบ
php artisan migrate:make add_votes_to_user_table --table=users
php artisan migrate:make create_users_table --create=users
Running Migrations ( การสงใหคาสง migration ทางาน )การสงใหคาสง migration ทางาน
php artisan migrate
กาหนดทอยของไฟลทจะรน
php artisan migrate --path=app/foo/migrations
29
www.laravetut.com เรยนร laravel แบบเจาะลก
สงรนเฉพาะตรง package
php artisan migrate --package=vendor/package
หมายเหต: ถาเราเจอ error Class not foundใหรนคาสง composer update.
Rolling Back Migrations ( การยอนกลบการทางานครงลาสด )การยอนกลบการทางานครงลาสด
php artisan migrate:rollback
การยอนกลบทงหมด
php artisan migrate:reset
การยอนกลบแลวทางานใหมอกรอบ
php artisan migrate:refresh
php artisan migrate:refresh --seed
Database SeedingLaravel เตรยมการฟงกชนทชวยในการปอนขอมลจาลอง ทอาจจะใชทดสอบการทางานของเวบไวในโฟลเดอร app/database/seeds.ชอคลาสเรากตงชอตามตารางและรปแบบใหเปนไปตามแบบนครบ UserTableSeeder, โดยคาเรมตนเเลวจะเปน DatabaseSeeder โดยใชฟงกชนcall เพอรนคลาสอนๆทาใหเราลาดบการทางานได
30
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยาง
class DatabaseSeeder extends Seeder {
public function run() { $this->call('UserTableSeeder');
$this->command->info('User table seeded!'); }
}
class UserTableSeeder extends Seeder {
public function run() { DB::table('users')->delete();
User::create(array('email' => '[email protected]')); }
}
การทางานกใชคาสง db:seed command บน Artisan CLI:
php artisan db:seed
ทาการยอนกลบการทางานดวย
php artisan migrate:refresh --seed
31
www.laravetut.com เรยนร laravel แบบเจาะลก
Schema Builder ( คลาสเกยวกบการสรางตาราง )คลาส Schemaใชในการจดการตาราง มกใชรวมกบคาสง migration
สรางและลบตารางสรางตารางใหมดวยเมทอด Schema::create ตามตวอยางเลยครบ
Schema::create('users', function($table){ $table->increments('id');});
เมทอดตวแรกคอชอตาราง พารามเตอรทสองคอ Closure ทจะรบออปเจคของคลาส Blueprint ในการสรางตาราง
จะเปลยนชอตารางใชเมทอดrename
Schema::rename($from, $to);
ในการเลอกการเชอมตอกรณเรามหลายฐานขอมลใชเมทอด Schema::connection
Schema::connection('foo')->create('users', function($table){ $table->increments('id'):});
จะลบตารางใชเมทอด Schema::drop
Schema::drop('users');
Schema::dropIfExists('users');
32
www.laravetut.com เรยนร laravel แบบเจาะลก
เพมคอลมนในการแกไขตารางเราใชคาสง Schema::table
Schema::table('users', function($table){ $table->string('email');});
ตารางคาสงตางของคลาส 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
33
www.laravetut.com เรยนร laravel แบบเจาะลก
คาสง คาอธบาย
$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 ทาการเรยงลาดบคอลมน
ตวอยาง
$table->string('name')->after('email');
เปลยนชอ Columnsใชเมทอด renameColumn ครบ
ตวอยาง
Schema::table('users', function($table){ $table->renameColumn('from', 'to');});
หมายเหต: คอลมนชนด enum ไมสนบสนน
34
www.laravetut.com เรยนร laravel แบบเจาะลก
ลบ Columnsตวอยาง
Schema::table('users', function($table){ $table->dropColumn('votes');});
ลบหลายๆ คอลมน
Schema::table('users', function($table){ $table->dropColumn('votes', 'avatar', 'location');});
ตรวจวาตารางมอยไหมตรวจวาตารางมอยไหม
if (Schema::hasTable('users')){ //}
ตรวจวาคอลมนมอยไหม
if (Schema::hasColumn('users', 'email')){ //}
35
www.laravetut.com เรยนร laravel แบบเจาะลก
เพม Indexesสรางทง Column และ Index
$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
Foreign Keys คยเชอมตวอยางการเพมคยเชอม
$table->foreign('user_id')->references('id')->on('users');
ในตวอยางเราทาการใหคอลมน user_idอางองกบคอลมน id บนตารางusers
เราสามารถเสรมคาสง "on delete" และ "on update" เขาไปเหมอนตวอยาง
$table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade');
ในการลบใชเมทอด dropForeign ตวอยาง
$table->dropForeign('posts_user_id_foreign');
หมายเหต: ใหชนดของคอลมนทเปนคยเชอมใหเปน unsigned ทกครงกรณทเชอมไปยง คอลมนทเปน interger และเปน auto_increment ครบ
36
www.laravetut.com เรยนร laravel แบบเจาะลก
ลบ Indexesในการลบคยเชอม larave ตงคาคยเปนคาเรมตนใหเเลวนะครบ โดยอางองจากชนดกบชอของตารง
คาสง คาอธบาย
$table->dropPrimary('users_id_primary'); ลบคยหลกจากตาราง users
$table->dropUnique('users_email_unique'); ลบคยเดยวจากตาราง users
$table->dropIndex('geo_state_index'); ลบคยทวไปจาก ตาราง geo
ชนดของตารางการเซตชนดของตารางเราใชเมทอด engine ตามตวอยางครบ
Schema::create('users', function($table){ $table->engine = 'InnoDB';
$table->string('email');});
37
www.laravetut.com เรยนร laravel แบบเจาะลก
Eloquent ORM
ทาความรจกกอนEloquent ORM คอการทเราจาลองตารางเปนคลาสแลว เรยกใชงานเปนชอของตาราง นนเลยทาใหเขาใจการพฒนารวดเรวขน เขาใจงายขน ทเรยกวาEloquent เพราะตวมนมความเรยบงาย สามารถเขาใจวาจะใชไดยงไงทนท ถาเคยเขยน php แบบ oop มากอน
การใชงานเบองตนเรมตนดวยการสราง moedel ไวทโฟลเดอร app/models
ตวอยางการสราง model
class User extends Eloquent {}
ถาคลาสนจะไมใชตารางตามชอ model เรากสามารถใชตวแปร table ในการกาหนดชอตารางทเราจะใช เหมอนในตวอยาง
class User extends Eloquent {
protected $table = 'my_users';
}
หมายเหต: Eloquent จะถอวาคอลมน id เปนคยหลกเสมอ เราสามารถใชตวแปร primaryKey เพอกาหนดคยหลกไดเอง และเชนเดยวกนเราสามารถใชตวแปร connectionเพอกาหนดฐานขอมลทเราจะใชใน model น
ถาในตารางของเรามคอลมนทชอ updated_at กบ created_at จะถกใชในการเกบเวลาทขอมลในแถวนถกเพมหรอแกไข.ถาเราไมตองการเพยงแคตงคาตวแปร $timestamps ใหเปน false
การควรโดยใช eoloquent
คนหาขอมลทงหมดจากตาราง user
$users = User::all(); //
คนหาตามเงอนไข
คนหาโดยคา id เทากบ 1
38
www.laravetut.com เรยนร laravel แบบเจาะลก
$user = User::find(1); //
แสดงคาในคอลมนออกมา
var_dump($user->name); //
Note: ทกคาสงทใชใน query builder สามารถใชกบ eloquent ไดเชนกน
การควรแลวสงตอ
บางเวลาเมอคนหาเเลวไมเจอเราตองการใหเกดหนาแสดงขอผดพลาดขนมา สามารถใชฟงกชน findOrFail เหมอนในตวอยางเลยครบถาคนไมเจอเราจะสงไปหนา 404 ทนท
$model = User::findOrFail(1);
$model = User::where('votes', '>', 100)->firstOrFail();
อยากจะสรางการแสดงขอผดพลาดโดยทเรากาหนดเองกสามารถทาตามตวอยางเลยครบ สมมตเราจะสรางฟงกชนModelNotFoundExceptionเรากเรยกตวคลาสหลกเขามากอน
use Illuminate\Database\Eloquent\ModelNotFoundException;
App::error(function(ModelNotFoundException $e){ return Response::make('Not Found', 404);});
ตวอยางการควรแบบหลายเงอนไข
$users = User::where('votes', '>', 100)->take(10)->get();
foreach ($users as $user){ var_dump($user->name);}
การคานวนแบบตางๆ
$count = User::where('votes', '>', 100)->count();
39
www.laravetut.com เรยนร laravel แบบเจาะลก
ถาเราอยากเขยนคาสงควร ขนมาใชเองกตองใชฟงกชน whereRaw
$users = User::whereRaw('age > ? and votes = 100', array(25))->get();
การสงคาอาเรยลงฐานขอมลเราสามารถสง คาจานวนมากอยางเชน อาเรย ลงฐานขอมลไดงายๆ แตตองใชตวแปร
fillable เพอกาหนดวาคอลมนไหนทสามารถใสอาเรยได
guarded เพอกาหนดวาคอลมนไหนใสอาเรยลงไปไมได
ตวอยางการกาหนดคา fillable
class User extends Eloquent {
protected $fillable = array('first_name', 'last_name', 'email');
}
ตวอยางการตงคาตวแปร guard
class User extends Eloquent {
protected $guarded = array('id', 'password');
}
ตวอยางคอลมน id and password เราจะไมอนญาตใหทาการใสคาทมาในรปแบบอาเรยลงไป
การปองกนไมใหทาการเพมขอมลเปนอาเรย
protected $guarded = array('*');
40
www.laravetut.com เรยนร laravel แบบเจาะลก
การเพมขอมลพรอมตรวจสอบ
สราง user ใหม
$user = User::create(array('name' => 'John'));
รบคามาใสตามคอลมน จะอพเดทถามคาอยแลว ถาไมมจะสรางใหม
$user = User::firstOrCreate(array('name' => 'John'));
ตรวจสอบวามคาไหม.
$user = User::firstOrNew(array('name' => 'John'));
เพม, ลบ, แกไขตวอยางการแกไขขอมลแบบไมใช namespace
$user = new User;
$user->name = 'John';
$user->save();
หมายเหต: โดยเรมตน laravel จะทาการเพมคาคยหลกใหอตโนมต ถาเราไมตองการกตงคาตวแปร incrementingใน model ใหเปน false.
เราสามารถใชคาสง create เพอสรางขอมลใหมได แตกอนหนานนตองกาหนดตวแปร fillable หรอ guarded ไมงนเพมไมไดตด error
การสรางขอมลใหม
$user = User::create(array('name' => 'John'));
41
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยางการแกไขขอมล
$user = User::find(1);
$user->email = '[email protected]';
$user->save();
บางเวลาเราตองบนทกคาในตารางทอางองกน เราจะใชคาสง push
บนทกคาพรอมกบบนทกลงตารางทมการเชอมกนอย
$user->push();
ตวอยางการลบขอมล
$user = User::find(1);
$user->delete();
ลบโดยกาหนด id เปนเงอนไข
User::destroy(1);
User::destroy(1, 2, 3);
ตวอยางการลบแบบมเงอนไข:
$affectedRows = User::where('votes', '>', 100)->delete();
ถาเราตองการแกไขเฉพาะคอลมนทใชบนทกเวลา เราจะใชคาสง touch
ตวอยางการใชงาน
$user->touch();
42
www.laravetut.com เรยนร laravel แบบเจาะลก
การกาหนดวาขอมลนถกลบเเลวเราสรางตวแปร $softdelete เพอบอก model วาไมตองลบจรง เหมอนกบเราเอาไปเกบไวในถงขยะกอน ยงไมไดเอาไปเผาทงจรงๆ
class User extends Eloquent {
protected $softDelete = true;
}
แลวกเพมคอลมน deleted_at ลงในตาราง เพอกาหนดวาขอมลแถวนถกลบแลวหรอยง
เมอเราเรยกคาสง delete กบ model นคอลมน deleted_at จะถกเพมคาใหเปนวนเวลาทเราลบ เมอเราคนหาขอมลโดยใช modelนขอมลแถวทเราทาการลบจะไมถกดงขนมา
ตวอยางการคนหา โดยรวมแถวทถกตงคาวาลบแลว
$users = User::withTrashed()->where('account_id', 1)->get();
ตวอยางการคนหา โดยคนหาเฉพาะแถวทถกตงคาวาลบแลว
$users = User::onlyTrashed()->where('account_id', 1)->get();
ถาตองการยกเลกการลบ ใชคาสง restore ไดเลยครบ
$user->restore();
หรอจะเรยกคนเฉพาะแถวกตามตวอยางนเลย
User::withTrashed()->where('account_id', 1)->restore();
ฟงกชน restore สามารถใชกบความสมพนธไดดวย
$user->posts()->restore();
ถาตองการลบขอมลจรงๆ กใชคาสง forceDelete
$user->forceDelete();
43
www.laravetut.com เรยนร laravel แบบเจาะลก
คาสง forceDelete กสามารถใชกบความสมพนธกได
$user->posts()->forceDelete();
ฟงกชน trashed ใชในการตรวจวาโมเดลนมการตงคา softdelete ไวไหม
if ($user->trashed()){ //}
Timestamps การบนทกเวลาโดยคาเรมตน laravel ใชคอลมน created_at และ updated_at ในตารางของเราโดยอตโนมต.
ตวอยางการยกเลกการเกบเวลาในการจดการขอมล
class User extends Eloquent {
protected $table = 'users';
public $timestamps = false;
}
ฟงกชน freshTimestampใชในการกาหนดรปแบบวนเวลาทเราจะเกบ
ตวอยางการใชงาน
class User extends Eloquent {
public function freshTimestamp() { return time(); }
}
44
www.laravetut.com เรยนร laravel แบบเจาะลก
Query Scopesเราใชคานาหนาฟงกชนวา scope เพอทาการสรางฟงกชนทใชควรแบบเฉพาะของเราเอง:
ตวอยางการใชงาน scope
class User extends Eloquent {
public function scopePopular($query) { return $query->where('votes', '>', 100); }
}
การใชงานควรทมาจาการใชคาสง scope
$users = User::popular()->orderBy('created_at')->get();
ความสมพนธการจดการความสมพนธตารางใน laravel ม 4 รปแบบ
1 ตอ 11 ตอ กลมกลม ตอ กลมความสมพนธแบบซบซอน
45
www.laravetut.com เรยนร laravel แบบเจาะลก
1 ตอ 1
ตวอยางความสมพนธแบบ 1 ตอ 1 ผใชงานมโทรศพทไดเเคเครองเดยว
ตวอยางความสมพนธแบบ 1 ตอ 1
class User extends Eloquent {
public function phone() { return $this->hasOne('Phone'); }
}
เราใชฟงกชนเปนตวกาหนดตารางทเราจะเชอมดวย ตวอยางขางลางการคนหาโทรศพทของผใชงานทม id เทากบ 1
$phone = User::find(1)->phone;
ถาเขยนเปน php ธรรมดากจะไดเเบบนครบ
select * from users where id = 1
select * from phones where user_id = 1
โดยคาเรมตนเเลว Eloquent จะใชคอลมน user_id ในตาราง Phone เปน คยเชอม ถาเราไมเอา จะเอาชอทเราตงเองกใชตวแปร hasOneเปนตวแกดงตวอยาง
return $this->hasOne('Phone', 'custom_key');
ในการเชอมโมเดลสงทสาคญคอการตงคาความสมพนธใหตรงกนใน Phone model เรากจะใชฟงกชน belongsTo ในการเชอมกลบไปยง User
ตวอยางการเชอมกลบไปยง User Model
class Phone extends Eloquent {
public function user() { return $this->belongsTo('User'); }
}
46
www.laravetut.com เรยนร laravel แบบเจาะลก
เหมอนกบขางบนครบ เราไมเอา user_id เปนคยเชอมกตองกาหนดดวย ตามตวอยาง
class Phone extends Eloquent {
public function user() { return $this->belongsTo('User', 'custom_key'); }
}
1 ตอ กลม
ความสมพนธแบบ 1 ตอ กลม มตวอยางคอ 1 โพสมไดหลาย ความคดเหนตวอยางการใช hasMany
class Post extends Eloquent {
public function comments() { return $this->hasMany('Comment'); }
}
ตวอยางการคนหาตารางทเชอมกนอย
$comments = Post::find(1)->comments;
ตวอยางการคนหาแบบหลายเงอนไขครบ ดงตวอยาง เราจะคนหาความคดเหนทม title ชอ foo โดยเอาคาเเรกทเจอกอน
$comments = Post::find(1)->comments()->where('title', '=', 'foo')->first();
อกครง อยาลมเชอมกลบไปยงตารางทเชอมมานะครบ
47
www.laravetut.com เรยนร laravel แบบเจาะลก
ดตวอยางอกครง
class Comment extends Eloquent {
public function post() { return $this->belongsTo('Post'); }
}
กลม ตอ กลม
กลมตอกลม จะเปนความสมพนธทยงยากพอสมควรเลยครบ เรามตวอยางคอ ผใชงานมสทธการใชงานไดหลายสทธ ทงเรยกด,ลบ,แกไข,เพมแลวแตละสทธกถกใชไดในหลายผใชงาน เราตองม 3 ตาราง users, roles, กบ role_user. ตาราง role_userจะเกบ user_id กบ role_idเพอบอกวา ผใชงานคนนมสทธทาอะไรไดบาง
laravel ใชฟงกชน belongsToMany ในการเชอมความสมพนธ:
class User extends Eloquent {
public function roles() { return $this->belongsToMany('Role'); }
}
ตอนนเราสามารถตรวจไดเเลววาผใชงานหมายเลข 1 มสทธทาอะไรไดบาง
$roles = User::find(1)->roles;
ถาเราตองการใชชอตาราง ตามใจเรากสามารถทาไดโดยการ สงพารามเตอรไป ดงตวอยางครบ
return $this->belongsToMany('Role', 'userroles');
หรอจะเปลยนไปจนถงชอคอลมนเลยกได แตตองสงชอ คอลมนทเราตงเองไปบอก model ดวย
return $this->belongsToMany('Role', 'userroles', 'user_id', 'foo_id');
อยาลมเชอมความสมพนธกลบมาดวยนะครบ
48
www.laravetut.com เรยนร laravel แบบเจาะลก
class Role extends Eloquent {
public function users() { return $this->belongsToMany('User'); }
}
ความสมพนธทยงยากมากขน
เพอชวยใหเขาใจไดงายขนจะมตวอยางมาใหดกนครบตวอยางโครงสรางตาราง
staff id - integer name - string
orders id - integer price - integer
photos id - integer path - string imageable_id - integer imageable_type - string
มนพเศษตรงทคอลมน imageable_id กบ imageable_type ของตาราง photos ทเราจะใชเกบคยทใชเชอมตาราง photo เขากบตาราง staff หรอorder ใชเกบคยเชอมรวมกนได โดยใชคอลมน เมอเรากาหนดคยเชอมและชอของตารางทเชอมไป ORM จะทาการตรวจสอบโดยใชคอลมนทimageable_type ในการหาวาคยนเปนของตารางไหน โดยเราตองตงชอฟงกชนวา imageable เราตองประกาศ model แบบนครบ
49
www.laravetut.com เรยนร laravel แบบเจาะลก
�
ต
�� �� �
class Photo extends Eloquent {
public function imageable() { return $this->morphTo(); }
}
class Staff extends Eloquent {
public function photos()
{ return $this->morphMany('Photo', 'imageable'); } }
class Order extends Eloquent {
public function photos()
{
return $this->morphMany('Photo', 'imageable');
}
}
�
นหารปภาพได�
�
ตวอยาง
$staff = Staff::find(1);
foreach ($staff->photos as $photo){ //}
50
www.laravetut.com เรยนร laravel แบบเจาะลก
ความพเศษจรง ๆอยทเมอเราใช Photo model ในการคนครบ
ตวอยาง
$photo = Photo::find(1);
$imageable = $photo->imageable;
ความสมพนธทชอ imageable บน model Photo จะสงขอมลของทง Staff และ Order หรอตารางใดตารางหนงขนอยกบคาทเราใชคนหาจะไปตรงกบ model ไหน
การใชความสมพนธแบบซบซอนในแบบ many to many
โมเดล Post และ โมเดล Video ตางมความสมพนธแบบ many to many กบโมเดล Tag มาดโครงสรางตารางเพอความเขาใจงายกนดกวาครบ
posts id - integer name - string
videos id - integer name - string
tags id - integer name - string
taggables tag_id - integer taggable_id - integer taggable_type - string
ตอไปเรามาตงคาความสมพนธใหโมเดลกนครบ โมเดล Post และ Video จะใชความสมพนธแบบ morphToMany กบโมเดล tags
class Post extends Eloquent {
public function tags() { return $this->morphToMany('Tag', 'taggable'); }
}
51
www.laravetut.com เรยนร laravel แบบเจาะลก
ในโมเดล Tag เราจะเชอมกบโมเดลทงสอง โดยใช morphByMany ผานทางตาราง taggable ความเรยบงายของ laravel ทาใหความสมพนธทแสนจะนาปวดหวงายขน
class Tag extends Eloquent {
public function posts() { return $this->morphedByMany('Post', 'taggable'); }
public function videos() { return $this->morphedByMany('Video', 'taggable'); }
}
ปล. การเรยกใชกเหมอนกบ morphMany ดานบนเลยครบ
การควรโดยใชความสมพนธเปนเงอนไขเราสามารถจากดผลการคนหาดวยฟงกชน has
คนหาโดยจากดเฉพาะความสมพนธ
$posts = Post::has('comments')->get();
เลอกขอมลของตาราง post โดยเอาเฉพาะทม comment
$posts = Post::has('comments', '>=', 3)->get();
เลอก post ทม comment มากกวาหรอเทากบ 3
52
www.laravetut.com เรยนร laravel แบบเจาะลก
การคนหาแบบยดหยน
Eloquent ทาใหเราสามารถคนหาแบบตอเนองโดย พยายามใหเราจากดขอบเขตการคนหาใหไดลกลงทสดเพอใหไดเฉพาะขอมลทตองการจรงๆและพลกแพลงรปแบบของฟงกชนไดมากมาย ดงตวอยาง
class Phone extends Eloquent {
public function user() { return $this->belongsTo('User'); }
}
$phone = Phone::find(1);
แทนทเราจะทาแบบขางบน ซงจะทาใหเราไดคาทไมตองการออกมามาก เรากเปลยนมาใชแบบขางลาง เราสามารถเขาถง อเมล ของผใชงานคนแรกไดเลย
echo $phone->user()->first()->email;
หรอจะใหสนไดอก กทาตามนเลยครบ
echo $phone->user->email;
Eager LoadingEager loading มเพอแกปญหาการควรแบบ N + 1 ตวอยางคอ, ผเเตงหนงคนสามารถแตงหนงสอไดหลายๆ เลม ความสมพนธจะออกมาแบบน
class Book extends Eloquent {
public function author() { return $this->belongsTo('Author'); }
}
53
www.laravetut.com เรยนร laravel แบบเจาะลก
แลวการควรทมปญหากประมาณน
foreach (Book::all() as $book){ echo $book->author->name;}
1 ควร จะทาการดงคาหนงสอทงหมดจากตาราง, แลวการควรครงตอไปกจะทาเหมอนกน. ถามหนงสอ 25 เลม,จะมการควรถง 26 ครงคอเราใชขอมลทงหมดของตารางหนงสอไปคนหาผแตง 1 ผแตงกจะไปดงหนงสอทงหมดของเขาออกมา
select * from books
select * from authors where id = ?
นกถงเรามขอมลเรมตน 1000 แถว ปญหานสวนใหญจะเกดขนกบความสมพนธแบบ hasManyเพราะเราตองนาทงหมดไปคนหาตอแลวแตละแถวจะไดผลลพทออกมาหลายๆ แถวจานวนผลการคนหาทมหาศาลจะทาใหการควรชามากแตซงถาขอมลตงตนยงมากกวานลงไปแตงควรเองโดยใช Fluent Query Builder แตถายงจะใช Eloquent กยงโชคดท laravel มฟงกชน with ใชในการทาใหเรวขน
foreach (Book::with('author')->get() as $book){ echo $book->author->name;}
sql ทเกดขนจะมหนาตาแบบนครบ เรมจากคนหาหนงสอทหมดกอนแลว คอยเอา id ทไดไปคนตอในตาราง authors เราเปลยนไปใช in แทน
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
จะทาใหเวบของเราโหลดเรวขนอยางมากเลยครบ
ตวอยาง การใช eager loading ในกรณตารางมการเชอมกบอกหลายตาราง
$books = Book::with('author', 'publisher')->get();
จะใชการทา eager load กบคอลมนอนได
$books = Book::with('author.contacts')->get();
54
www.laravetut.com เรยนร laravel แบบเจาะลก
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 แลวใสเงอนไขเขาไปอก สามารถกาหนดไดดงนครบ:
$users = User::with(array('posts' => function($query){ $query->where('title', 'like', '%first%');}))->get();
Lazy Eager Loading
เราสามารถใชการทา eager loading ไปยงตารางทเชอมกนไดเหมอนในตวอยางครบเราเขาไปคนตอไปในตาราง publisher ทเชอมกบตาราง author อก
$books = Book::all();
$books->load('author', 'publisher');
การบนทกขอมลแบบมความสมพนธสมมตอเราจะเพมความคดเหนลงบทความนแลวเรากตองนา id ของบทความทเราโพสความคดเหนใสไปมาใสในความคดเหนดวย
ตวอยางการเกบขอมลทตองมความสมพนธ
$comment = new Comment(array('message' => 'A new comment.'));
$post = Post::find(1);
$comment = $post->comments()->save($comment);
ในตวอยางคอลมนpost_id จะถกใสคาใหอตโนมต
การจดการฟอเรยนคย
เมอเราจะทาการแกไขขอมลทมความสมพนธแบบ กลมตอหนง เราตองใชฟงกชน associateในการเพมคาคยเชอมไปยงตารางทมความสมพนธอยดวย
55
www.laravetut.com เรยนร laravel แบบเจาะลก
$account = Account::find(10);
$user->account()->associate($account);
$user->save();
การเพมขอมลแบบกลมตอกลม (Many To Many)
ตวอยางคอเราจะทาการเพมความสามารถใหผเราตอง laravel มฟงกชน attach มาใหใชเเลว
การเพมขอมลแบบกลมตอกลม
$user = User::find(1);
$user->roles()->attach(1);
ตวอยางขางลาง เราจะทาการเพมขอมลไปยงตารางทใชเชอม สามารถสงเปนอาเรยกได:
$user->roles()->attach(1, array('expires' => $expires));
เมอเพมแลวกลบได ฟงกชน detach ใชลบคาในตารางทใชเชอม
$user->roles()->detach(1);
เราสามารถใชฟงกชน syncเมทอด เพอการเพมคาไปยงตารางทเชอมอยดวยได ในขณะทเพมลงในตารางหลก
ตวอยางการใช sync กบความสมพนธแบบกลมตอกลม
$user->roles()->sync(array(1, 2, 3));
Aตวอยางการใช sync กบตารางกลาง
$user->roles()->sync(array(1 => array('expires' => true)));
การใชเมทอด save เพอทาการเพมขอมลงตารางทเชอมกนอย
$role = new Role(array('name' => 'Editor'));
User::find(1)->roles()->save($role);
56
www.laravetut.com เรยนร laravel แบบเจาะลก
ในตวอยางเราสราง Role model แลวแนบไปกบ User model. แลวยงสามารถแนบอาเรยเขาไปไดอก
User::find(1)->roles()->save($role, array('expires' => $expires));
การแกไขคอลมนทเกบเวลาในตารางทเชอมดวยตวอยาง เมอเราแกไขขอมลในตาราง Comment เราตองการแกไขขอมลในตาราง Post ในแถวทเชอมกนดวย laravel เตรยมฟงกชน touch มาใหเเลววธการใชงานในตวอยางเลยครบ
class Comment extends Eloquent {
protected $touches = array('post');
public function post() { return $this->belongsTo('Post'); }
}
ตอนนถาเราทาการแกไขขอมลในตาราง Comment, คอลมน updated_at ขอมลในตาราง Postทเชอมดวยกจะถกแกไขดวย
การจดการตารางทใชเชอมlaravel เตรยมฟงกชน pivot มาใหเราใชในการจดการขอมลของตารางทใชเชอมตรงกลางระหวางสองตาราง ดงตวอยางเลยครบ
$user = User::find(1);
foreach ($user->roles as $role){ echo $role->pivot->created_at;}
คลาส Role model จะดงคาออกมาจากตารางกลาง โดยใชฟงกชนpivot โดยอตโนมต
โดยคาเรมตนแลวคาทไดจาก ตารางทเปนตวเชอมจะมคาเดยวทใชอางองไปยง อกตารางคอ id เทานน แตถาเราตองการเพมกตองเพมไปตอนทกาหนดความสมพนธแบบในตวอยาง
return $this->belongsToMany('Role')->withPivot('foo', 'bar');
57
www.laravetut.com เรยนร laravel แบบเจาะลก
ตอนนตวแปร foo กบ bar จะถกใชกบฟงกชน pivot ในการจดการตาราง Role
และถาเราตองการ คอลมน created_at กบ updated_at เพอใชกาหนดเวลา laravel มฟงกชน withTimestampsซงเราตองกาหนดตอนประกาศความสมพนธครบ
return $this->belongsToMany('Role')->withTimestamps();
ตอมาถาเราตองการลบขอมลในตารางในตารางกลาง เพอความถกตองของขอมลเราจะใชฟงกชน detachนะครบ
ตวอยางการใชงาน
User::find(1)->roles()->detach();
เราจะทาการแกไขไมใหผใชงานหมายเลข 1 มสทธในการทาอะไรเลย
Has Many Through
ใชอานวยความสะดวก ในการเขาถงโมเดลทมความสมพนธกน แตตองเรยกผานโมเดลอกหลายตว ยกตวอยาง โมเดล Country มความสมพนธแบบone to many กบโมเดล Posts เชเดยวกบโมเดล Users โครงสรางตารางของทงสามโมเดลจะเปนแบบน
countries id - integer name - string
users id - integer country_id - integer name - string
posts id - integer user_id - integer title - string
จะเหนวาตาราง posts จะไมไดเกบ country_id ดวยความสามารถของความสมพนธแบบ hasManyThrough จะทาการเชอมตอ อตโนมตใหทาเราสามารถเรยก ใชงานโมเดล post ได โดยการประกาศ ฟงกชนดงตวอยาง
58
www.laravetut.com เรยนร laravel แบบเจาะลก
class Country extends Eloquent {
public function posts() { return $this->hasManyThrough('Post', 'User'); }
}
ตวอยางนกเปนการอนญาตใหเรา กาหนดฟอเรยนคยได
class Country extends Eloquent {
public function posts() { return $this->hasManyThrough('Post', 'User', 'country_id', 'user_id'); }
}
Collectionsขอมลทเปนผลลพทของการคนหานนจะกลบออกมาเปน อาเรย eloquent อานวนความสะดวกใหเราโดยมฟงกชน contains ใหในการตรวจสอบขอมล
ตรวจวาในผลลพททไดมามขอมลทมคยหลก เปน 2 ไหม
$roles = User::find(1)->roles;
if ($roles->contains(2)){ //}
เพอความสบายของเรายงขนไปอกเมอคนเสรจกเอาเฉพาะคา role แปลงเปนอาเรย หรอ json เสรจสรรพเลย
$roles = User::find(1)->roles->toArray();
$roles = User::find(1)->roles->toJson();
แทนทจะใชการทา foreach แบบปกตเหมอนเดม eloquent มฟงกชน each กบ filter มาให
59
www.laravetut.com เรยนร laravel แบบเจาะลก
การใชงาน each และ filter
$roles = $user->roles->each(function($role) {
});
$roles = $user->roles->filter(function($role){});
เพมการ Callback
$roles = User::find(1)->roles;
$roles->each(function($role){ //});
เรยงลาดบคาทอยในอาเรยดวยฟงกชน sortby
$roles = $roles->sortBy(function($role){ return $role->created_at;});
บางครงเราตองการเปลยนแปลงคาทงออปเจคเลย eloquent กมฟงกชน newCollection ใหใชในการเขยนทบ
ตวอยางการใชงาน
class User extends Eloquent {
public function newCollection(array $models = array()) { return new CustomCollection($models); }
}
60
www.laravetut.com เรยนร laravel แบบเจาะลก
Accessors & Mutatorsบางเวลาเราตองการ จดรปแบบขอมลใหอยในรปแบบทเราตองการ กอนจะบนทกหรอดงมาใช eloquent เตรยมฟงกชน getFooAttributeแตการตงชอฟงกชนคาเรมตนของคาทเปนชอของคอลมน ตองขนตนดวยตวพมพใหญ ในกรณทมเครองหมาย _ มาคนคาหลงจากนนกตองขนตนดวยตวพมพใหญครบ
ตวอยาง
class User extends Eloquent {
public function getFirstNameAttribute($value) { return ucfirst($value); }
}
ในตวอยางเราทาการสราง accessor ของคอลมน first_name ทนคาทเราสงเขาฟงกชนนกจะถกสงไปเกบถกทละครบ
การสรางฟงกชน Mutator กคลายๆ กน
ตวอยาง
class User extends Eloquent {
public function setFirstNameAttribute($value) { $this->attributes['first_name'] = strtolower($value); }
}
61
www.laravetut.com เรยนร laravel แบบเจาะลก
Date Mutatorsโดยคาเรมตนเเลว Eloquent จะทาการตงคาใหคอลมน created_at, updated_at, และ deleted_at ตามคาเบองตนของ php.ini อยเเลวนะครบ
แตถาเราตองการแกไขหรอเรยกใชงานแบบไมอยากเขาไปยงตรงๆ กสามารถใชฟงกชน getDates แบบในตวอยางเลยครบ
public function getDates(){ return array('created_at');}
ขางในเราสามารถจดการกอนเอาไปใชไดเลย และ laravel กมคลาสจดการ วนเวลาทมฟงกชนหลากหลายมากอยาง Carbon มาใหใชดวยแตตองไปประกาศชอยอในไฟล app.php กอนนะครบ โดยคาเรมตนเเลวไมม
Model EventsEloquent เตรยมฟงกชนทคอยดกจบเหตการณตางๆ มาใหเราดงนครบ creating, created, updating, updated, saving, saved, deleting,deleted. แตถาคาทสงกลบมาเปน false เหตการณ creating, updating, หรอ saving จะถกยกเลก
การยกเลกการแกไขขอมล
User::creating(function($user){ if ( ! $user->isValid()) return false;});
การทเราจะสรางฟงกชนในการจดการเหตการณของ model ตองประกาศฟงชน boot กอนนะครบ
การประกาศฟงกชน boot
class User extends Eloquent {
public static function boot() { parent::boot();
// Setup event bindings... }
}
62
www.laravetut.com เรยนร laravel แบบเจาะลก
Model ObserversEloquent มคลาสชอ Observer ในการสรางฟงกชนทใชจดการเหตการณ ฟงกชนcreating, updating, savingกตงตามเหตการณทจะใหฟงกชนนนจดการครบ ตวอยาง
class UserObserver {
public function saving($model) { // }
public function saved($model) { // }
}
แลวเรากตองประกาศโดยใชฟงชน observe แบบตวอยาง
User::observe(new UserObserver);
การแปลงคาเปน Arrays หรอ JSONการแปลงผลลพททคนมาใหกลายเปน array
$user = User::with('roles')->first();
return $user->toArray();
return User::all()->toArray();
การแปลงผลลพธใหกลายเปน json
return User::find(1)->toJson();
63
www.laravetut.com เรยนร laravel แบบเจาะลก
การใชงาน Eloquent จากใน route เลย
Route::get('users', function(){ return User::all();});
บางเวลาาเราไมอยากใหบางคอลมนถกเรยกไปพรอมกบ toJson หรอ toArray เรากใชตวแปร hidden ในการนน
ตวอยางการใชงาน
class User extends Eloquent {
protected $hidden = array('password');
}
64
www.laravetut.com เรยนร laravel แบบเจาะลก
Query Builder ( ฟงกชนทใชจดการฐานขอมล )คอการจดการๆควรของ laravel ชวยอานวยความสะดวกใหเรา ไมตองเขยนควรยาวๆ ดวยตวเองครบ
การเลอกขอมลดงคาทงหมดจากตาราง users
$users = DB::table('users')->get();
foreach ($users as $user){ var_dump($user->name);}
ดงคาแถวแรกจากตาราง users โดย name เทากบ john
$user = DB::table('users')->where('name', 'John')->first();
var_dump($user->name);
ดงคาจากตาราง users โดย name เทากบ john แลวกเอาแคคอลมนทชอวา name
$name = DB::table('users')->where('name', 'John')->pluck('name');
65
www.laravetut.com เรยนร laravel แบบเจาะลก
ดงคาทงหมดจากตาราง roles โดยเอาแคคอลมน title
$roles = DB::table('roles')->lists('title');
คาทคนมาจะเปนอาเรยนะครบ ถาเราอยากใสคยใหแตละแถวเราใสพารามเตอรตวทสองเขาไป name จะไปเปนคยใหกบ title
$roles = DB::table('roles')->lists('title', 'name');
เมทอด select ใชกาหนดคาสงในการเลอกเอง
$users = DB::table('users')->select('name', 'email')->get();
$users = DB::table('users')->distinct()->get();
$users = DB::table('users')->select('name as user_name')->get();
เลอกขอมลจากผลการควรอกท
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
การใช where
$users = DB::table('users')->where('votes', '>', 100)->get();
การใชหลายๆเงอนไขโดยวธเชนเมทอด
$users = DB::table('users') ->where('votes', '>', 100) ->orWhere('name', 'John') ->get();
ใช between
$users = DB::table('users') ->whereBetween('votes', array(1, 100))->get();
66
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยางการใช where กบ In รวมกน
$users = DB::table('users') ->whereIn('id', array(1, 2, 3))->get();
$users = DB::table('users') ->whereNotIn('id', array(1, 2, 3))->get();
ใชหาแถวทเปนคาวางตามคอลมน
$users = DB::table('users') ->whereNull('updated_at')->get();
ตวอยางการเรยงลาดบขอมล
$users = DB::table('users') ->orderBy('name', 'desc') ->groupBy('count') ->having('count', '>', 100) ->get();
การจากดขอมล
$users = DB::table('users')->skip(10)->take(5)->get();
Joinsตวอยางการ join ครบ
DB::table('users') ->join('contacts', 'users.id', '=', 'contacts.user_id') ->join('orders', 'users.id', '=', 'orders.user_id') ->select('users.id', 'contacts.phone', 'orders.price');
67
www.laravetut.com เรยนร laravel แบบเจาะลก
การจอยแบบเตมควรลงไปชวยประหยดเวลา เวลาคดไมออกวาจะใชฟงกไหนด แทรกควรลงไปตรงๆ เลย:
DB::table('users') ->join('contacts', function($join) { $join->on('users.id', '=', 'contacts.user_id')->orOn(...); }) ->get();
Advanced Wheresการ where แบบ หลายเงอนไข
DB::table('users') ->where('name', '=', 'John') ->orWhere(function($query) { $query->where('votes', '>', 100) ->where('title', '<>', 'Admin'); }) ->get();
หนาตาของควรจะออกมาเปนแบบน
select * from users where name = 'John' or (votes > 100 and title <> 'Admin')
หาวามคานอยไหม
DB::table('users') ->whereExists(function($query) { $query->select(DB::raw(1)) ->from('orders') ->whereRaw('orders.user_id = users.id'); }) ->get();
68
www.laravetut.com เรยนร laravel แบบเจาะลก
หนาตาของควรจะออกมาเปนแบบน
select * from userswhere exists ( select 1 from orders where orders.user_id = users.id)
Aggregates การหาผลรวมชนดตางๆตวอยางการคานวนคา
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
$price = DB::table('orders')->min('price');
$price = DB::table('orders')->avg('price');
$total = DB::table('users')->sum('votes');
Raw ExpressionsRaw คอการใสควรแบบสดๆ เขาไปเลยไมตองไปใหฟงกชนสรางให ประหยดเวลามากขนเมอเราตองการคนหาแบบซบซอน
ตวอยางการใชคาสงควร
$users = DB::table('users') ->select(DB::raw('count(*) as user_count, status')) ->where('status', '<>', 1) ->groupBy('status') ->get();
69
www.laravetut.com เรยนร laravel แบบเจาะลก
การเพมและลดคาใหคอลมน
DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);
การกาหนดคาคอลมนทจะเพมคาให
DB::table('users')->increment('votes', 1, array('name' => 'John'));
การเพมขอมลตวอยาง
DB::table('users')->insert( array('email' => '[email protected]', 'votes' => 0));
การเพมคาพรอมกบเพมคา id ดวย
$id = DB::table('users')->insertGetId( array('email' => '[email protected]', 'votes' => 0));
หมายเหต: ถาใช PostgreSQL เมทอด insertGetId คาดหวงวาจะใชคอลมน "id" เปนตวทมนจะเพมให
การเพมหลายๆขอมล
DB::table('users')->insert(array( array('email' => '[email protected]', 'votes' => 0), array('email' => '[email protected]', 'votes' => 0),));
70
www.laravetut.com เรยนร laravel แบบเจาะลก
การแกไขตวอยาง
DB::table('users') ->where('id', 1) ->update(array('votes' => 1));
การลบตวอยาง
DB::table('users')->where('votes', '<', 100)->delete();
การลบขอมลทงหมดเปนการลบแบบแถวตอแถว
DB::table('users')->delete();
การลบแบบลบทงตารางดวยแลวสรางขนใหม
DB::table('users')->truncate();
การทา Unionsunion คอการจบผลลพทของการ selecet 2 ครง มารวมกนเปนหนงผลลพทการทา union ใน querie
$first = DB::table('users')->whereNull('first_name');
$users = DB::table('users')->whereNull('last_name')->union($first)->get();
มเมทอด unionAll ใชงานเหมอนกบ union เลยครบ
71
www.laravetut.com เรยนร laravel แบบเจาะลก
การยดทรพยากรเพอใชงานใน 4.1 นไดเพม เมทอด sharedLock เพอชวยในการทา transaction
DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
เมทอด lockForUpdate ใชในการยดขอมลท จะทาการแแกไขจนกวาจะเสรจครบ
DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
Caching Queriesเราสามารถทาการแคชหรอบนทกผลการควรไวบน session กอนดวยเมทอด remember
ตวอยาง
$users = DB::table('users')->remember(10)->get();
ในตวอยางเราจะแคชผลการคนหานเปนเวลา 10 นาท ระหวางนการควรจากตวอยางจะไมไปดงขอมลจากฐานขอมลแตจะดงจากแคชจนกวาจะหมดเวลาครบ
72
www.laravetut.com เรยนร laravel แบบเจาะลก
Forms & HTMLเปนคลาสทใชจดการ Form กบ html
การเปดฟอรมตวอยาง
{{ Form::open(array('url' => 'foo/bar')) }} //{{ Form::close() }}
โดยคาเรมตนชนดของคารองขอจะเปน POST ถาจะเปลยนกเเคใสพารามเตอรไปเหมอนในตวอยางครบ
echo Form::open(array('url' => 'foo/bar', 'method' => 'put'))
สามารถกาหนดเปาหมายของไฟลทจะสงคาไปไดหลายรปแบบตามตวอยางเลยครบ
echo Form::open(array('route' => 'route.name'))
echo Form::open(array('action' => 'Controller@method'))
จะกาหนดพารามเตอรโดยเฉพาะเลยกตามตวอยางครบ:
echo Form::open(array('route' => array('route.name', $user->id)))
echo Form::open(array('action' => array('Controller@method', $user->id)))
ถาจะสรางฟอรมมาอพโหลดไฟลกตองตงคาแบบตวอยางครบ files
echo Form::open(array('url' => 'foo/bar', 'files' => true))
การปองกน CSRFLaravel เตรยมการปองกนโดยสรางคา hash ขนจาก session ของ user แลวสราง hidden form ขนมาใสไว เราเพยงแตใชเมทอดtokenประกาศไวกเสรจเเลวครบ
73
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยาง
echo Form::token();
การปองกน csrf จากใน route
Route::post('profile', array('before' => 'csrf', function(){ //}));
การดงคาจากตารางมาใสในฟอรมlaravel เตรยมเมทอด Form::model มาเพอการนนครบ
ตวอยาง
echo Form::model($user, array('route' => array('user.update', $user->id)))
ถาชอของคอลมนตรงกบ ชอของฟอรมคากจะปรากฏมาโดยอตโนมต อยางเชนฟอรมชอ email,ตรงกบโมเดลชอ emailแตคาทจะปรากฏบนฟอรมไมไดมแคคาทมาจากโมเดลอยางเดยว มจาก session คาทมาจากการสงพารามเตอรอกลาดบการแสดงคาจงตามขางลางนครบ
1. คาจาก Session (คาเกาทเกดจาการปอน)2. คาจากการสงพารามเตอร3. คาจากโมเดล
ซงเมอ server สงคาการตรวจสอบคาทปอนมาวาผดพลาด คาทสงมาจากโมเดลกจะตามกลบขนมาดวย
หมายเหต: เมอใช Form::modelอยาลม Form::close!
การใสปายชอการใสปายชอใหฟอรม
echo Form::label('email', 'E-Mail Address');
การใสคลาสใหฟอรม
74
www.laravetut.com เรยนร laravel แบบเจาะลก
echo Form::label('email', 'E-Mail Address', array('class' => 'awesome'));
หมายเหต: หลงจากใสคา label ชอฟอรม คา id กจะตงตามคา label โดยอตโนมต.
Text, Text Area, Password & Hidden Fieldsตวอยางฟอรมทใชรบคา
echo Form::text('username');
กาหนดคาเรมตนใหฟอรม
echo Form::text('email', '[email protected]');
หมายเหต: hidden และ textarea ฟงกชนใชงานเหมอน text เมทอด
สรางฟอรมรบรหสผาน
echo Form::password('password');
สรางฟอรมชนดอน
echo Form::email($name, $value = null, $attributes = array());echo Form::file($name, $attributes = array());
Checkboxes and Radio Buttonsสรางฟอรมชนดเลอกคา
echo Form::checkbox('name', 'value');
echo Form::radio('name', 'value');
สรางฟอรมชนดเลอกคาโดยคาเรมตนคอเลอกไวเเลว
echo Form::checkbox('name', 'value', true);
echo Form::radio('name', 'value', true);
75
www.laravetut.com เรยนร laravel แบบเจาะลก
File Inputสรางฟอรมอพโหลดไฟล
echo Form::file('image');
Drop-Down Listsสรางฟอรมใหเลอกคาแบบดรอบดาวน
echo Form::select('size', array('L' => 'Large', 'S' => 'Small'));
สรางฟอรมชนดเลอกคาแบบดรอบดาวนโดยคาเรมตนคอเลอกไวเเลว
echo Form::select('size', array('L' => 'Large', 'S' => 'Small'), 'S');
แบงกลมใหตวเลอก
echo Form::select('animal', array( 'Cats' => array('leopard' => 'Leopard'), 'Dogs' => array('spaniel' => 'Spaniel'),));
สรางดรอปดาวนแบบชวง
echo Form::selectRange('number', 10, 20);
สรางดรอปดาวนแบบเดอน
echo Form::selectMonth('month')
76
www.laravetut.com เรยนร laravel แบบเจาะลก
Buttonsสรางป มสงคา
echo Form::submit('Click Me!');
หมายเหต: ถาจะสรางป มธรรมดากใช button
Custom Macrosmacro คอชดของ html ทเราเขยนเตรยมไว สามารถนาเอาไปแทรกตามใจเราได
การสราง Form Macro
Form::macro('myField', function(){ return '<input type="awesome">';});
เรยก Form Macro มาใช
echo Form::myField();
77
www.laravetut.com เรยนร laravel แบบเจาะลก
Templates ( คลาสทใชจดการ Blade Template )
การควบคม Layoutsเราใชตวแปร layout เพอกาหนดเลเอาทหลกใหกบ controller ครบ
ตวอยางการใชงาน
class UserController extends BaseController {
/** * The layout that should be used for responses. */ protected $layout = 'layouts.master';
/** * */ public function showProfile() { $this->layout->content = View::make('user.profile'); }
}
Blade Templatingคอคลาสทใชในการเขยน html ขนมาดวย php ทาใหเราสามารถสราง html ทมโครงสรางซบซอนได การจะใชนนตองตงชอไฟลเปน ชอview.blade.php
ตวอยางทยงใช html อย
78
www.laravetut.com เรยนร laravel แบบเจาะลก
<!-- Stored in app/views/layouts/master.blade.php -->
<html> <body> @section('sidebar') This is the master sidebar. @show
<div class="container"> @yield('content') </div> </body></html>
ใช blade ในการสรางเลเอาททงหมด
@extends('layouts.master')
@section('sidebar') @parent
<p>This is appended to the master sidebar.</p>@stop
@section('content') <p>This is my body content.</p>@stop
extend ใชในการดงคาจากเลเอาทอนมาใช @parent ทาใหเราสามารถใช view อนแทรกเขามาได @section กใชงานโดยการแทรก htmlจากไฟลอนเขาไป
การใชงานฟงกชน php ใน bladeการแสดงขอมล การแทรกขอมล
Hello, {{ $name }}.
The current UNIX timestamp is {{ time() }}.
79
www.laravetut.com เรยนร laravel แบบเจาะลก
ทนเรากใช syntax แบบสนๆ ในการแสดงผลจาก server ไดเเลว
Hello, {{ $name }}.
การแสดงขอความในวงเลบปกกา
ถาเราตองแสดงขอความธรรมดาในวงเลบปกกา เราจะใชเครองหมาย @ นาหนา
@{{ This will not be processed by Blade }}
ถาเราตองการแสดงขอความท มรปแบบเปน tag html เรากตองใชวงเลบปกกาสามตวในการ escape string:
Hello, {{{ $name }}}.
การใช if
@if (count($records) === 1) I have one record!@elseif (count($records) > 1) I have multiple records!@else I don't have any records!@endif
@unless (Auth::check()) You are not signed in.@endunless
การใช Loops
@for ($i = 0; $i < 10; $i++) The current value is {{ $i }}@endfor
@foreach ($users as $user) <p>This is user {{ $user->id }}</p>@endforeach
80
www.laravetut.com เรยนร laravel แบบเจาะลก
การแทรก Views
@include('view.name')
การแสดงภาษา
@lang('language.line')
@choice('language.line', 1);
การทาคอมเมน
{{-- This comment will not be in the rendered HTML --}}
81
www.laravetut.com เรยนร laravel แบบเจาะลก
Errors & Logging
การแสดง Errorโดยคาเรมตนเเลวการแสดงขอผดพลาดจะถกเปดใชงานอยเเลว หากเราพฒนาเวบเสรจ กอนจะสงขนโฮสตงกควรเขาไปตงคาตวแปร debug ทapp/config/app.php ใหเปน false
การจดการ Errorsโดยคาเรมตนเเลวการจดการขอผดพลาดตางๆเราจะทาในไฟล app/start/global.php
App::error(function(Exception $exception){ Log::error($exception);});
ถาเราอยากกาหนดการทางานหลงจากเกด RuntimeException เรากทาไดดงตวอยางครบ
App::error(function(RuntimeException $exception){ // Handle the exception...});
เมอเราใชการ return ในฟงกชนขางลางน คาจะถกสงกลบไปยงบราวเซอรเสมอครบ:
App::error(function(InvalidUserException $exception){ Log::error($exception);
return 'Sorry! Something is wrong with this account!';});
การดกรอ PHP fatal errors เราใชฟงกชน App::fatal
App::fatal(function($exception){ //});
82
www.laravetut.com เรยนร laravel แบบเจาะลก
HTTP Exceptionsกรณขอผดพลาดทเกดขนเพราะไมพบหนาทเรยก (404), กบไมมสทธเขาถง (401) เราสามารถแกไขคาทจะไปแสดงไดดงน
App::abort(404, 'Page not found');
App::abort(401, 'You are not authorized.');
คา 404 คอรหสขอผดพลาดครบ
การจดการขอผดพลาด 404เราสามารถสรางหนาแสดงขอผดพลาดทเรา สามารถออกแบบไดเอง แลวตองมาตงคาแบบในตวอยางน พารามเตอรทหนงคอ ทอยของไฟล view
App::missing(function($exception){ return Response::view('errors.missing', array(), 404);});
การเกบ logคลาสทใชในการเกบ log ของ laravel เปนการใชคลาส Monolog มาพฒนาตอ Laravel ตงคาเรมตนใหเกบ log ทกวนแลวสงไปเกบไวในapp/storage/logsเราสามารถกาหนดคา log ทจะเขยนไดดงตวอยาง
Log::info('This is some useful information.');
Log::warning('Something could be going wrong.');
Log::error('Something is really going wrong.');
ประเภทของ log ถกประกาศไวในมาตรฐาน RFC 5424 ม debug, info, notice, warning, error, critical, และ alert.
83
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยางการสงคาทเปนอาเรยใหฟงกชน info ทอยในคลาส log
Log::info('Log message', array('context' => 'Other helpful information'));
การดงคามาใชกใชฟงกชนตามตวอยางเลยครบ
$monolog = Log::getMonolog();
เราสามารถกาหนดเหตการณทเราจะใหเกบ log ไดโดยใชฟงกชน listen:
ตวอยาง
Log::listen(function($level, $message, $context){ //});
84
www.laravetut.com เรยนร laravel แบบเจาะลก
Artisan ( การเรยกใชงาน php ผานทาง cmd )
แนะนาArtisan คอ ชดคาสงทใชเรยกงานผานทาง command lineเพอชวยใหจดการงานตางใหงาย รวดเรวขน ซง laravel นา Class console ของsymfony มาปรบใช
การใชงานในการเรยกดคาสงทงหมดใชคาสง list
php artisan list
ทกคาสงจะมวธการใชใหเราด โดยเพม parameter help เขาไปนะครบ
ตวอยางการใชงาน help
php artisan help migrate
เราสามารถเรยก พรอมกบเปลยนการตงคาโดยรวมของเวบโดยเพมพารามเตอร --env
ตวอยางนเราเรยกในการตงคาแบบ local
php artisan migrate --env=local
จะเรยกดรนของ laravel กไดโดยพารามเตอร --version
php artisan --version
85
www.laravetut.com เรยนร laravel แบบเจาะลก
การสรางคาสงขนใชงานเองเราสามารถสรางคาสง artisan ขนมาใช โดยไฟลจะเกบทโฟลเดอร app/commands ถาเราไมอยากเกบไวตรงนกไปตงคาทไฟล composer.json ได
การสรางคาสง
เรมสรางคลาส
เราจะใชคาสง command:make ใน command line เพอสราง class ขนมากอนครบ
ตวอยางการใช command line สรางคาสง
php artisan command:make FooCommand
ถาเราอยากจะเปลยนทอยใหกบไฟลคาสงของเรา กใชคาสงนไปเลยครบ
php artisan command:make FooCommand --path="app/classes" --namespace="Classes"
การตงคาคาสง
เรมตนโดยการตง name และ description รวมถงสวนประกอบอนของคลาส, โดยคาเหลานจะไปปรากฏตอนคาสง artisan listฟงกชน fire ใชในการเรยกฟงกชนตางๆ ทจะทางานในคาสงน
การตงคาตางๆ
getArguments กบ getOptions เมทอด เปนทๆ เราะทาการตงคาจะตางๆ ทง พารามเตอรท 1 ท 2 การตงคาจะมลกษณะการสงคาลงอาเรย.
เมอเรา คาสงของเรามการใหปอนพารามเตอร ตวของ array ตองมรปแบบดงน
array($name, $mode, $description, $defaultValue)
ตวแปร mode เรากาหนดใหเปนแบบตองม InputArgument::REQUIRED หรอไมมกได InputArgument::OPTIONAL.
เมอเรากาหนดใหมการใสคาสงเพมเตม ลกษณะอาเรยจะเปนแบบน
array($name, $shortcut, $mode, $description, $defaultValue)
ในการกาหนด mode ใหเปนไดหลายๆแบบไดเชน
86
www.laravetut.com เรยนร laravel แบบเจาะลก
InputOption::VALUE_REQUIRED, InputOption::VALUE_OPTIONAL, InputOption::VALUE_IS_ARRAY, InputOption::VALUE_NONE.
ตวอยางรปแบบคาทตองปอนใหเมอกาหนด mode เปน VALUE_IS_ARRAY
php artisan foo --option=bar --option=baz
การเขาถงตวแปร
เมอคาสงทางาน เรากตองมตวจดการในการ ดงคาตางๆ ในพารามเตอรของการตงคา ทรบมา
การดงคาจากพารามเตอรเฉพาะตว
$value = $this->argument('name');
การดงคาทงหมด
$arguments = $this->argument();
การรบคาจากคาการตงคาแบบเฉพาะตว
$value = $this->option('name');
การรบคาจากคาการตงคาแบบทงหมด
$options = $this->option();
87
www.laravetut.com เรยนร laravel แบบเจาะลก
การสงผลการทางาน
มประเภทของคาสงทจะแสดงออกทาง commandline 4 ประเภท คอ info , comment , question และ error ทง 4 มรปบแบบ unicode เปน ANSI
สงขอมลของคาสงออกทางหนาจอ
$this->info('Display this on the screen');
สงขอความออกไปทางหนาจอ
$this->error('Something went wrong!');
ใหผใชงานเลอก
เราสามารถใชการถามคาถาม และ ยนยน เพอความรวดเรวในการใชงาน
การถามคาถาม
$name = $this->ask('What is your name?');
การถามคาถามและคาทปอนมาเปนรปแบบ
$password = $this->secret('What is the password?');
ยนยนการเลอก
if ($this->confirm('Do you wish to continue? [yes|no]')){ //}
เราสามารถกาหนดคาเรมตนของคาสง confirm ใหเปนtrue หรอ false ได
$this->confirm($question, true);
88
www.laravetut.com เรยนร laravel แบบเจาะลก
การลงทะเบยนคาสงเมอการสรางคาสงเสรจสน เราตองนาไปลงทะเบยนทไฟล app/start/artisan.php โดยใชคาสง Artisan::add เพอลงทะเบยน
ตวอยางการใชงาน
Artisan::add(new CustomCommand);
ถาคาสงเราใชใน IoC container เราตองใชคาสง Artisan::resolve เพอผกคาสงของเราไปกบ IOC ดวย
ตวอยางการใชงาน
Artisan::resolve('binding.name');
การเรยกใชคาสงอนรวมบางเวลาเราตองการจะเรยกใชคาสงอนๆ สามารถใชฟงกชน call เรยกได
ตวอยางการใชงาน
$this->call('command.name', array('argument' => 'foo', '--option' => 'bar'));
89
www.laravetut.com เรยนร laravel แบบเจาะลก
Events
การใชงานเบองตนคลาส Event เตรยมมาใหเราใชในการดกจบเหตการณตางๆทเกดขนบน เวบของเราหมายเหต Event คอเหตการใดทเกดขนบนเวบเรา ยกตวอยางการเพมลบแกไข , Listener คอ ฟงกชนทคอยดกจบเหตการ , fireคอฟงกชนทสงใหเกดเหตการขนเพอให listerner ทางาน
ใครนกไมออกใหนกถง event บน jquery ครบ
การดกรอฟงเหตการณ
Event::listen('user.login', function($user){ $user->last_login = new DateTime;
$user->save();});
การสงใหเกดเหตการณขน
$event = Event::fire('user.login', array($user));
เราสามารถกาหนดลาดบเหตการทจะใหเกดได โดยคาลาดบทเกดเรยงจากนอยไปหามาก.
การใชลาดบควบคมการทางาน
Event::listen('user.login', 'LoginHandler', 10);
Event::listen('user.login', 'OtherHandler', 5);
บางครงเราอยากจะใหฟงกชนทดกฟงอยทางานแคครงเดยว เราสามารถใชการ return false เพอหยดฟงกชนนได
90
www.laravetut.com เรยนร laravel แบบเจาะลก
หยดการทางานของเหตการ
Event::listen('user.login', function($event){ // Handle the event...
return false;});
ประกาศไวตรงไหนด
เรากสรางไฟลอกไฟลใหชอวา event.php ไวตรงทเดยวกบไฟล route.php แลวนาไป include ไวในไฟล start.php ในโฟลเดอร global
Wildcard Listenersคอการดกฟงทกเหตการเลย ไมเฉพาะเจาะจงเเลว
การใชงาน
Event::listen('foo.*', function($param, $event){ // Handle the event...});
ทนถามเหตการณอะไรทขนตนดวย foo..ฟงกชนในตวอยางกจะทางาน
ใช Classes กบ Listenersในบางกรณ เราสามารถผกคลาสเขากบเหตการได โดย laravel จะผกคลาสเขาไป
ตวอยาง
Event::listen('user.login', 'LoginHandler');
โดยคาเรมตนฟงกชน handle ในคลาส LoginHandlerจะถกเรยกกอนเลย เหมอนกบ _construct
91
www.laravetut.com เรยนร laravel แบบเจาะลก
ฟงกชน handle จะถกเรยกใชเลย
class LoginHandler {
public function handle($data) { // }
}
ถาเราไมตองการ กผกเมทอดทเราตองการเขาไปดงนครบ
Event::listen('user.login', 'LoginHandler@onLogin');
การเรยงลาดบเหตการใชฟงกชน queue กบ flush ในการเรยงลาดบการเกดเหตการ
การสรางลาดบ
Event::queue('foo', array($user));
Event Subscribersคอคลาสทเราแบงกลมฟงกชนทใชจดการเหตการ โดยตนทางมาจากฟงกชน subscribe
ตวอยาง
$subscriber = new UserEventHandler;
Event::subscribe($subscriber);
92
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยางการสรางคลาส Subscriber
class UserEventHandler {
/** * track user login */ public function onUserLogin($event) { // }
/** * track user logout */ public function onUserLogout($event) { // }
/** * fire event to observer event * */ public function subscribe($events) { $events->listen('user.login', 'UserEventHandler@onUserLogin');
$events->listen('user.logout', 'UserEventHandler@onUserLogout'); }
}
เมอประกาศคลาสแลว การนาไปใชงานเรากตองเอาไปลงทะเบยนกบคลาสหลก
93
www.laravetut.com เรยนร laravel แบบเจาะลก
Facadesความเหนสวนตว บทนจะตองใชจนตนาการเยอะหนอยนะครบ เพราะเปนเรองของแนวคดทใชสรางจดขายของตว laravel เลยครบ ในการตด$this-> ทงไปทาใหโคดอานงาย ทาความเขาใจงาย ลดบรมาณการเขยนลง ใครทอยากจะเอาคลาสบน packagist มาทาเปน packageใชเองตองอานครบ
รจกดานหนาของตกกนกอน
ถายงไมรจกวามนคออะไรลองไปอานทผม สรปไวกไดครบ
Facades แปลเปนไทยคอ ดานหนาของตก ทมาของมนคอการใช facade design pattern เขามาจดการทา ใหคลาสทเราเรยกใชงานกลายเปนแบบstatic แทนทจะสรางเปนออปเจคเหมอนทผานมา การทาแบบ static คอการเรยกใชคลาสนนตรงๆ เลยครบการทาแบบนจะทาใหรปแบบของฟงกชนดเขาใจไดงายมากบางครงเราไปเจอคลาสทเจงๆ และอยากเอาเขามาใชใน laravel เรากอยากใหมนเรยกแบบ static ไดเพราะฉะนนเราจงตองมาดบททนครบ
หลกการเบองตนโดยโครงสรางหลกของ laravel แลว, facade คลาสถกวางใหใชในการเรยกใชงาน วตถทถกลงทะเบยนไวในคลาส Container ในการสราง facadeขนใชเองนน เราตองการแคเมทอด getFacadeAccessorแคตวเดยวครบ ตวคลาส Facade หลกจะทาการใช __callStatic() ซงเปน magic-methodของ php จะไปทาการเรยกออปเจคของคลาสทเราทาการลงทะเบยนไวทคลาส Service Providerของ ไลบราล นนๆ
94
www.laravetut.com เรยนร laravel แบบเจาะลก
การประยกตใชงานในตวอยาง, เรายกตวอยาง คลาส Cache. ซงเรยกตวฟงกชน get ซงตอนนเปนรปแบบ static นะครบ
$value = Cache::get('key');
แตถาเราตามเขาไปดตามเสนทางน Illuminate\Support\Facades\Cache เราจะไมเหนฟงกชน get อยเลย
class Cache extends Facade {
/** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'cache'; }
}
การทางานคอเมทอด getFacadeAccessor()จะทาการสงคาทเราทาการผกไวในคลาสหลก โดยใชสตรงทเรากาหนดตรง returnในการคนหาคลาสทตรงกนให
เมอผใชงานอางองถงตว Cache คลาสในรปแบบ static, Laravel จะผกcache เขากบ IoC container และสงคาขอฟงกชนตามในตวอยาง (กรณนเปนget)
ถาจะเขยน Cache::get แบบปกตจะไดแบบนครบ
$value = $app->make('cache')->get('key');
การสราง Facadesการสราง Facade ให package หรอ คลาสภายนอกตองการ 3 อยางครบ
การทา IoC bindคลาส facadeการสราง alias ให facade
ตวอยางการสราง package แบบงายครบ
95
www.laravetut.com เรยนร laravel แบบเจาะลก
PaymentGateway\Payment.
namespace PaymentGateway;
class Payment {
public function process() { // }
}
เราตองทาการผกคลาสเขากบตวคลาสหลกกอน
App::bind('payment', function(){ return new \PaymentGateway\Payment;});
ทๆ เราจะนาฟงกชนขางบนไปเขยนไวคอทไฟล service provider ทชอ PaymentServiceProvider โดยใสไวขางในเมทอดregisterเราตองเอาเสนทางทอยของคลาส PaymentServiceProvider ไปใสตรงท app/config/app.php ดวย
ตอมา เรากสรางคลาส Facade ใหกบคลาส Payment
use Illuminate\Support\Facades\Facade;
class Payment extends Facade {
protected static function getFacadeAccessor() { return 'payment'; }
}
สดทาย เรานาทอยของไฟล Facade ไปใสทอาเรยชอ aliases ใน app/config/app.php และตองใชคาสง php artisan dump-autoloadกอนนะครบไมงน laravel จะไมเจอคลาส แลวสดทายเราสามารถเรยกเมทอด process ของ คลาส Payment ในรปแบบ static ไดเเลว
Payment::process();
96
www.laravetut.com เรยนร laravel แบบเจาะลก
Helper Functionsเปนคลาสอเนกประสงคทรวมการจดการอาเรย,สตรง,ยอารแอล อนๆ
Arrays
array_add
ฟงกชน array_add ใชเพม key / value ลงในอาเรยถาไมม key นนอย
$array = array('foo' => 'bar');
$array = array_add($array, 'key', 'value');
array_divide
ฟงกชน array_divide จะทาการแบงอาเรยทสงเขาไปออก เปนสองกอน กอนหนงเปน key กอนหนงเปน value
$array = array('foo' => 'bar');
list($keys, $values) = array_divide($array);
array_dot
ฟงกชน array_dot จะทาการแผอาเรยหลายมต ออกเปนมตเดยว โดยเราจะใชเครองหมายดอทในการเขาถงหลงจากใชฟงกชนแแลว
$array = array('foo' => array('bar' => 'baz'));
$array = array_dot($array);
// array('foo.bar' => 'baz');
array_except
ฟงกชน array_except ใชลบคา key หรอ value ออกจากอาเรย
$array = array_except($array, array('keys', 'to', 'remove'));
97
www.laravetut.com เรยนร laravel แบบเจาะลก
array_fetch
ฟงกชน array_fetch จะสงอาเรยมตเดยวทเรากาหนดไดวาจะเอาคาเฉพาะ คยชออะไร
$array = array(array('name' => 'Taylor'), array('name' => 'Dayle'));
var_dump(array_fetch($array, 'name'));
// array('Taylor', 'Dayle');
array_first
ฟงกชน array_first จะสงคาแรกของอาเรยคนมา
$array = array(100, 200, 300);
$value = array_first($array, function($key, $value){ return $value;});
คาทออกมาจะเปน 100
array_last
ใชดงคาตวสดทายใน array
$array = array(350, 400, 500, 300, 200, 100);
$value = array_last($array, function($key, $value){ return $value;});
98
www.laravetut.com เรยนร laravel แบบเจาะลก
array_flatten
ฟงกชน array_flatten ทาการแตกอาเรยหลายมตลงมาเหลอมตเดยว
$array = array('name' => 'Joe', 'languages' => array('PHP', 'Ruby'));
$array = array_flatten($array);
// array('Joe', 'PHP', 'Ruby');
array_forget
ฟงกชน array_forget ใชลบคาออกจากอาเรยโดยกาหนดตาแหนง ดวยใชเครองหมายดอท$array = array('names' => array('joe' => array('programmer')));
$array = array_forget($array, 'names.joe');
array_get
ฟงกชน array_get ใชดงคาออกจากอาเรยโดยกาหนดตาแหนง ดวยเครองหมายดอท
$array = array('names' => array('joe' => array('programmer')));
$value = array_get($array, 'names.joe');
array_only
ฟงกชน array_only ใชดงคาจากเฉพาะ key ทเรากาหนด ไดคาเดยว
$array = array('name' => 'Joe', 'age' => 27, 'votes' => 1);
$array = array_only($array, array('name', 'votes'));
99
www.laravetut.com เรยนร laravel แบบเจาะลก
array_where
ใชกรองขอมลในอาเรย
$array = array(100, '200', 300, '400', 500);
$array = array_where($array, function($key, $value){ return is_string($value);});
// Array ( [1] => 200 [3] => 400 )
array_pluck
ฟงกชน array_pluck ใชดงคาตามคยทกาหนด ไดหลายๆคา
$array = array(array('name' => 'Taylor'), array('name' => 'Dayle'));
$array = array_pluck($array, 'name');
// array('Taylor', 'Dayle');
array_pull
ฟงกชน array_pull ใชดงคาออกมาพรอมกบลบไปดวย.
$array = array('name' => 'Taylor', 'age' => 27);
$name = array_pull($array, 'name');
array_set
ฟงกชน array_set ใชเพมคาลงอาเรยโดยกาหนดทอยโดยใชเครองหมายดอท
$array = array('names' => array('programmer' => 'Joe'));
array_set($array, 'names.editor', 'Taylor');
100
www.laravetut.com เรยนร laravel แบบเจาะลก
array_sort
ฟงกชน array_sort ใชเรยงลาดบคาในอาเรย
$array = array( array('name' => 'Jill'), array('name' => 'Barry'),);
$array = array_values(array_sort($array, function($value){ return $value['name'];}));
head
ใชคนคาแรกของ อาเรย มประโยชมากในการทาการเรยกฟงกชนแบบตอเนอง
$first = head($this->returnsArray('foo'));
last
ใชคนคาสดทายของ อาเรย มประโยชมากในการทาการเรยกฟงกชนแบบตอเนอง
$last = last($this->returnsArray('foo'));
Pathsตวแปรทใชเกบคาทอยของโฟลเดอร
app_path
เกบคาทอยของโฟลเดอร application
base_path
เกบคาทอยของเวบระดบ root เลย
101
www.laravetut.com เรยนร laravel แบบเจาะลก
public_path
เกบคาทอยของโฟลเดอร public
storage_path
เกบคาทอยของโฟลเดอร application/storage
Stringsคลาสน ใชจดการตวอกษร เชนแปลงเปนตวใหญ รปแบบไวยกรณ
camel_case
แปลงคาใหขนตนดวยตวใหญซงเรยกวา camelCase.
$camel = camel_case('foo_bar');
// fooBar
class_basename
ใชดงชอคลาสจาก namespace path.
$class = class_basename('Foo\Bar\Baz');
// Baz
e
เรยกใชฟงกชน htmlentites เพอกรองคา
$entities = e('<html>foo</html>');
102
www.laravetut.com เรยนร laravel แบบเจาะลก
ends_with
ใชตรวจวาในประโยคจบดวยคาทกาหนดไหม
$value = ends_with('This is my name', 'name');
snake_case
แปลงคาใหไปอยในรปแบบ snake_case คออกษรขนตนคาเปนตวเลกแลวแบงคาดวยเครองหมายอนเดอรสกอร
$snake = snake_case('fooBar');
// foo_bar
starts_with
ใชตรวจวาในประโยคขนตนดวยคาทกาหนดไหม
$value = starts_with('This is my name', 'This');
str_contains
ใชตรวจวาในประโยคมคาทกาหนดไหม
$value = str_contains('This is my name', 'my');
str_finish
เพมตวอกษรทกาหนดลงไปทายคา
$string = str_finish('this/string', '/');
// this/string/
str_is
ตรวจวาคาทปอนเขามาตรงกบรปแบบทกาหนดไหม
$value = str_is('foo*', 'foobar');
103
www.laravetut.com เรยนร laravel แบบเจาะลก
str_plural
แปลงตวอกษรจากเอกพจนเปนพหพจ ปล.เตม s,es,ies
$plural = str_plural('car');
str_random
สมตวอกษรขนมาโดยกาหนดความยาวตามคาทปอนเขามา
$string = str_random(40);
str_singular
แปลงตวอกษรจากเอกพจนเปนเอกพจน
$singular = str_singular('cars');
studly_case
แปลงคาใหไปอยในรปแบบ StudlyCase คออกษรขนตนคาเปนตวใหญถามเครองหมายอนเดอรสกอรกลบออก
$value = studly_case('foo_bar');
// FooBar
trans
ใชแปลภาษาเหมอนกบใช Lang::get.
$value = trans('validation.required'):
trans_choice
แปลโดยเรมตนจากคาทกาหนดโดยนบตอไปตามคาจากตวแปร $count เหมอนกบ Lang::choice.
$value = trans_choice('foo.bar', $count);
104
www.laravetut.com เรยนร laravel แบบเจาะลก
URLsเปนฟงกชนทใชจดการ URL
action
สรางลงจาก controller
$url = action('HomeController@getIndex', $params);
asset
สรางลงจากไฟลทอยในโฟลเดอร asset
$url = asset('img/photo.jpg');
link_to
สรางลงโดยกาหนดคาตางๆเอง
echo link_to('foo/bar', $title, $attributes = array(), $secure = null);
link_to_asset
สรางลงจากไฟลทอยในโฟลเดอร asset
echo link_to_asset('foo/bar.zip', $title, $attributes = array(), $secure = null);
link_to_route
สรางลงโดยอางองจากคา route
echo link_to_route('route.name', $title, $parameters = array(), $attributes = array());
link_to_action
สรางลงเขาไปหาฟงกชนใน controller
echo link_to_action('HomeController@getIndex', $title, $parameters = array(), $attributes = array());
105
www.laravetut.com เรยนร laravel แบบเจาะลก
secure_asset
สรางลงจากไฟลทอยในโฟลเดอร asset โดยใช https
echo secure_asset('foo/bar.zip', $title, $attributes = array());
secure_url
สรางลงทเปน https
echo secure_url('foo/bar', $parameters = array());
url
สรางลงจากการกาหนดเอง
echo url('foo/bar', $parameters = array(), $secure = null);
Miscellaneousฟงกชนอเนกประสงค
csrf_token
สรางคา hash ทใชปองกนการโจมตแบบ csrf
$token = csrf_token();
dd
ใชในการดงคาทงหมดในตวแปรออกมาแสดง
dd($value);
value
ดงคาจากฟงกชนทไมมชอ
$value = value(function() { return 'bar'; });
106
www.laravetut.com เรยนร laravel แบบเจาะลก
IoC Container
Introductionหมายเหต :: ถาใครยงไมคอยเขาใจวาสองตวนมนคออะไรลองไปอานทผมสรปไวทนกอนครบ
IOC คอคลาสทใชในการจดการ library ภายนอกทเรานาเขามาใช หรอทดงเขามาใชโดย composerตอไปนจะเรยกยอๆวา IOC นะครบIOC จะชวยในการเรยกใชงานคลาสตาง การทาความเขาใจ IOC ถอวาเปนหวใจ เลยในการปทางสการทาเวบขนาดใหญสาหรบlaravel นะครบ เพราะหลกการนจะเกยวโยงไปถงเรอง Service Provider กบ Facade
การใชงานเบองตนการใชงาน IOC ในการผก object
App::bind('foo', function($app){ return new FooBar; //});
งายคอตอไปนพารามเตอรชอ foo จะใชเปนตวแทนของ class FooBar ทถกสรางเปนวตถแแลว
การเรยกใชงาน
$value = App::make('foo');
เมอเราเรยกใชงาน App::make เมทอด ฟงกชนขางบนกจะถกเรยกใชงาน ตวแปร valueกจะรบคณสมบตตางๆ ของคลาส FooBar เขามา
บางครงเราไมตองการสราง instane ทกครงทรเฟรช laravel มฟงกชน singleton มาใหใชในการนเลยครบ
107
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยางการใชงาน
App::singleton('foo', function(){ return new FooBar;});
ถาไมตองการจดเพมเขาไปทงคลาสจะยดเขาไปเปนออปเจคกใชฟงกชน instance ไดเลยครบ
ตวอยางการผกออปเจคเขาไป
$foo = new Foo;
App::instance('foo', $foo);
Automatic Resolutionตวอยางการผกคลาสอยางรวดเรวขนโดยไมตองใช App::bind แลวแตขอใหชอตรงกนกพอ
ตวอยาง
class FooBar {
public function __construct(Google $baz) { $this->baz = $baz; }
}
$fooBar = App::make('FooBar');
ในตวอยางน ตวแปร $foofBar จะเกบคาคลาส Google ทถกแทรกเขามา
laravel จะทาการเรยกใช reflection class ของ php เพอทาการตรวจสอบคาตางๆ ในคลาสนนใหเองครบบางกรณคลาสทเราจะใชงานดนไปดงคลาสทเปน interface เขามาใชดวย เพอการนนเราตองใช App::bind เมทอด ในการผก ดงตวอยาง
108
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยางการผก class ทเปนเรยกใชงาน interface
App::bind('UserRepositoryInterface', 'DbUserRepository');
คลาสทเราเรยกใชงาน
class UserController extends BaseController {
public function __construct(UserRepositoryInterface $users) { $this->users = $users; }
}
ตอนน UserRepositoryInterface จะถกเรยกใชงานแลว
การประยกตใชงานเพอความยดหยนในการทดสอบและใชงาน Laravel เตรยมการใหเราใชงาน IOC ไในหลายกรณเลยครบ
ตวอยางการเรยกใชงาน Class OrderRepository
class OrderController extends BaseController {
public function __construct(OrderRepository $orders) { $this->orders = $orders; }
public function getIndex() { $all = $this->orders->all();
return View::make('orders', compact('all')); }
}
ในตวอยางคลาส OrderRepository แทรกเขาไปโดยอตโนมตเมอ คลาส OrderController ทางาน เมอมการทา unit testing คลาสOrderRepository กจะถกเพมเขามาเหมอนกน
109
www.laravetut.com เรยนร laravel แบบเจาะลก
Filters, composers และ event handlers อยนอกเหนอการทางานของ IoC container เมอเราจะใชตองทาตามตวอยางครบ
การใชงาน View::composer,Route::filter และ Event::listen กบ IOC
Route::filter('foo', 'FooFilter');
View::composer('foo', 'FooComposer');
Event::listen('foo', 'FooHandler');
Service ProvidersService providers เปนการจบคลาส IOC ททางานคลายกนเขามาไวในทเดยวกน.แลวเรยกใชงาน ดวย facadeโดยหลกเเลวทกคลาสหลกของ laravel ใชการทา service provider ในการจดการเราสามารถเขาไปดไดตรงทตวแปรอาเรย providersตรงทapp/config/app.php
จะสราง Service Provider ขนมาใชกบคลาสของเราเรมแรกตองดงคลาส Illuminate\Support\ServiceProvider และประกาศเมทอด register
ตวอยางการสราง Service Provider
use Illuminate\Support\ServiceProvider;
class FooServiceProvider extends ServiceProvider {
public function register() { $this->app->bind('foo', function() { return new Foo; }); }
}
ในเมทอด register คลาส IOC จะเปนตวแปร $this->app ถาเราทาเสรจแลวกตองเอาเสนทางทอยของคลาส Provider ของเราไปเพมในอาเรยproviders ใน app.php ดวย
การเรยกใชงาน Service Provider ดวยเมทอด App::register
110
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยาง
App::register('FooServiceProvider');
Container Eventsใน IOC กม event อยชอเมทอดวา resolving
การใชงาน resoliving เพอรอดวาม IOC ตวไหนทางานบาง
App::resolving(function($object){ //});
111
www.laravetut.com เรยนร laravel แบบเจาะลก
Pagination ( การแบงการแสดงขอมล )
การตงคาการตงคาการของอยท app/config/view.php ตวแปรชอ pagination ในการแบงหนา ฟงกชน pagination::slider ใชในการสรางเลขหนาpagination::simple ใชสรางป ม "previous" และ "next"
การใชงานการใชงานมอยหลายรปแบบ เเตทงายทสดใชเมทอด paginateบน query builder หรอ Eloquent model.
ตวอยางโดยใช query builder
$users = DB::table('users')->paginate(15);
ต วอยางโดยใช Eloquent Model
$users = User::where('votes', '>', 100)->paginate(15);
ในตวอยางเรากาหนดจานวนขมลตอหนาได สวนการแสดงผลบน view เราจะใชฟงกชน links
<div class="container"> <?php foreach ($users as $user): ?>
<?php echo $user->name; ?> <?php endforeach; ?></div>
<?php echo $users->links(); ?>
เพยงแคนกจะไดการแบงหนาละครบ.
เราสามารถจดการๆ แบงหนาไดโดยฟงกชนตอไปนครบ:
getCurrentPage
getLastPage
getPerPage
112
www.laravetut.com เรยนร laravel แบบเจาะลก
getTotal
getFrom
getTo
บางครงเราอยากสรางเองเพราะอาจจะมขอมลทตองผานการคานวนหลายขน กใชเมทอดนเลยครบ Paginator::make
ตวอยาง
$paginator = Paginator::make($items, $totalItems, $perPage);
การสรางลงของการแบงหนาเราสามารทาการเรยงลาดบการแสดงผลไดโดยใชเมทอด appends เหมอนในตวอยาง
<?php echo $users->appends(array('sort' => 'votes'))->links(); ?>
ลงทออกมาหนาตาจะเปนแบบน
http://example.com/something?page=2&sort=votes
สวนทเพมเขามาใน 4.1 จะเปนการสรางลงแบงหนาแบบ ajaxดวยตวอยางน
<?php echo $users->fragment('foo')->links(); ?>
เราจะไดลงแบบนมา
http://example.com/something?page=2#foo
ซงเราสามารถประยกตไปใชรวมกบ ajax ได
113
www.laravetut.com เรยนร laravel แบบเจาะลก
Queues ( การสรางควเพอใชงานคาสงจานวนมาก )คลาสทชวยเรยงลาดบการทางานของฟงกชนตางๆ
การตงคาLaravel Queue เตรยมฟงกชนทใชในการเขาถง api ของเวบทใหบรการควไว การควคอการเรยงลาดบงานของเวบไซต เชน เรามเมลทตองสงถง 1000 ฉบบถาสงแบบเดม server อาจจะรบไมไหว เราจงมคลาส queueมาเพอการนครบ
ไฟลทใชตงคาเกบไวท app/config/queue.php. ในไฟลจะมขอมลทเราตองใชในการเชอมตอผใหบรการคว เชน Beanstalkd, IronMQ, AmazonSQS, and synchronous (สาหรบการทดสอบในเครอง)
ชอคลาสของผใหบรการควทเราจะปอนเขาไป:
Beanstalkd: pda/pheanstalkAmazon SQS: aws/aws-sdk-phpIronMQ: iron-io/iron_mq
การใชงานเบองตนในการสงงานใหมเขาไปในควเราใชฟงกชน Queue::push
การเพมงานลงในคว
Queue::push('SendEmail', array('message' => $message));
พารามเตอรตวแรกเปน ฟงชนทเราใชควบคมควน. ตวทสองเปนขอมลทเราจะทาการคว
114
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยางฟงกชนทใชควบคมการคว
class SendEmail {
public function fire($job, $data) { // }}
ฟงกชนfireรบพารามเตอร Job ตวทสองคอขอมล data ทจะสงลงคว
ถาเราไมใชเมทอด fireเราสามารถกาหนดไดตามตวอยางครบ
เปลยนจาก fire เปน Push
Queue::push('SendEmail@send', array('message' => $message));
เมอมการทางานไปเเลวเรากตองลบขอมลออกไปโดยใชเมทอด delete เพอลบ Job instance:
ตวอยางการลบ
public function fire($job, $data){ // Process the job...
$job->delete();}
ถาเราตองการเอางานททาไปกลบมาเขาควอกครงกใชเมทอด release ครบ
ตวอยาง
public function fire($job, $data){ // Process the job...
$job->release();}
เราสามารถกาหนดเวลาทจะหนวงไวกอนทจะสงใหงานตอไปทางานไดแบบนครบ
115
www.laravetut.com เรยนร laravel แบบเจาะลก
$job->release(5);
เมองานทเขาควเกดขอผดพลาดขน จะถกนากลบไปตอควใหม เราสามารถตรวจสอบการทางานใหมไดโดยฟงกชน attempts
ตรวจหางานทมการพยายามทามากกวา 3 ครง
if ($job->attempts() > 3){ //}
การเรยกขอมลของาน
$job->getJobId();
การสงฟงกชนเปนพารามเตอร เราสามารถใชงานฟงกชนทไมมชอในการสรางงานไดโดยตวอยางเลยครบ
Queue::push(function($job) use ($id){ Account::delete($id);
$job->delete();});
หมายเหต: เมอใชฟงกชนทไมมชอกบ queue ตวแปร __DIR__ และ __FILE__ จะไมสามารถใชงานได
ถาใชบรการของ Iron.io push queues, ควรจะไมใชงานฟงกชนทไมมชอในเมล. จะมการตรวจสอบคารองวาสงมาจาก Iron.io.จรงหรอไม ตวอยางhttps://yourapp.com/queue/receive?token=SecretToken.ควรทาการตรวจสอบคา secrettoken กอนทาการคว.
Running The Queue ListenerLaravel เตรยมคาสงqueue:listen เพอรอรบคาขอทมากจากผใหบรการ
ตวอยางการใชงาน
php artisan queue:listen
116
www.laravetut.com เรยนร laravel แบบเจาะลก
เราสามารถกาหนดคาการเชอมตอเสรมลงไปได:
php artisan queue:listen connection
เราสามารถใชโปรแกรม Supervisor เพอตรวจสอบวาคาสง queue listener ยงทางานอยไหม
สามารถตงคาเวลาทจะอนญาตใหเกดทางานขนได
ตวอยางการหนวงเวลา
php artisan queue:listen --timeout=60
สงใหงานชนแรกทอยบนควทางาน
php artisan queue:work
Push QueuesPush queues คอการโยนภาระการรอรบควจากททาบนเครองขงเรา เปลยนไปใหผบรการทาแทน ซงม Iron.io เจาเดยวทสนบสนน.กอนอนเราตองไปสมครบรการของ Ironio กอน, แลวนาขอมลการเชอมตอมาใสไวท app/config/queue.php
ตอมากใชคาสง Artisan queue:subscribe เพอลงทะเบยนควไวกบ Iron.io:
ตวอยาง
php artisan queue:subscribe queue_name http://foo.com/queue/receive
ตอนน ถาเราไปดทหนาแสดงผลควท Iron.io , กจะเหนรายการคว และรายชอลงทเราจะสงใหทางาน.เราสามารถลงทะเบยนไวทละหลายๆลงกได.ตอมาเราตองมาสราง route เพอรบคารองขอของ Iron.io โดยชอ route จะเปน queue/receiveและสงคากลบไปดวยฟงกชน Queue::marshal
Route::post('queue/receive', function(){ return Queue::marshal();});
เมทอด marshal จะดแลการทางานของควให
117
www.laravetut.com เรยนร laravel แบบเจาะลก
Failed Jobs ( การจดการงานททาไมสาเรจ )เมอมคาสงในควทเกดความผดพลาดขน เราจะใชตาราง failed_jobsในการเกบขอมล สาหรบการตงคานน ไปทไฟล app/config/queue.php
สาหรบการสรางตารางเพอเกบขอผดพลาดนน เราจะใชคาสง
php artisan queue:failed-table
ตวอยางนเราจะใชพารามเตอร --tries เพอกาหนดจานวนครงทจะทาคาสง ทผดพลาดใหม โดยเสรมเขาไปใน คาสง queue:listen
php artisan queue:listen connection-name --tries=3
นอกจากนเรายงสามารถใช เมทอด Queue::failing ในการดกจบเหตการณ แลวนาไปสรางการแจงเตอนได โดยใชโปรแกรม HipChat.
Queue::failing(function($job, $data){ //});
การเรยกดคาสงทงหมดทผดพลาด เราจะใชคาส queue:failed
php artisan queue:failed
คาสงนเราจะสงใหคาสงทผดพลาดตวท 5 ทางานอกครง
php artisan queue:retry 5
สาหรบการลบคาสงทผดพลาดนน เราใช queue:forget ในตวอยางเราลบตวท 5
php artisan queue:forget 5
เชนเดยวกนถาจะลบทงหมด เราจะใชคาสง flush ดงตวอยาง
php artisan queue:flush
118
www.laravetut.com เรยนร laravel แบบเจาะลก
Requests & Input ( การจดการคารองขอ )คลาสนใชจดการคารองขอตางๆ เชน คาทสงมาจากฟอรม
Basic Inputรบเฉพาะคาทมชอตรงกบทกาหนด
$name = Input::get('name');
กาหนดคาสารองกรณคาทสงมาเปน null
$name = Input::get('name', 'Sally');
ตรวจวาคาทสงมาเปนคาวางไหม
if (Input::has('name')){ //}
รบคาทงหมดของคารองขอ
$input = Input::all();
รบคาเปนกรณๆ ไป
$input = Input::only('username', 'password');
$input = Input::except('credit_card');
การเขาถงอาเรยในคาทสงมา
$input = Input::get('products.0.name');
119
www.laravetut.com เรยนร laravel แบบเจาะลก
Old Inputคอการทเราเกบคาทไดจากฟอรมไว เพอทาการใสในฟอรมถดไป หรอนาไปแสดงหลงจากหนาโหลดเสรจ
การนาคาในฟอรมเกบใส session
Input::flash();
การรบคาเฉพาะกรณ
Input::flashOnly('username', 'email');
Input::flashExcept('password');
เราทาการสงคาในฟอรมเกาทเกบไวขนไปในฟอรม
return Redirect::to('form')->withInput();
return Redirect::to('form')->withInput(Input::except('password'));
การดงคาจากในฟอรมเกา
Input::old('username');
Filesรบคาจากการอพโหลดไฟล
$file = Input::file('photo');
ตรวจวาไฟลถกอพโหลดไหม
if (Input::hasFile('photo')){ //}
120
www.laravetut.com เรยนร laravel แบบเจาะลก
คาทถกคนมาจะเปนเมทอด file method ซงมาจากคลาส Symfony\Component\HttpFoundation\File\UploadedFile ซงสบทอดมาจากคลาสSplFileInfo ซงเตรยมเมทอดไวใหเราจดการไฟลไวเยอะเลยครบ
เปลยนทอยใหไฟลทอพขนมา
Input::file('photo')->move($destinationPath);
Input::file('photo')->move($destinationPath, $fileName);
ดงคาเสนทางทอยของไฟล
$path = Input::file('photo')->getRealPath();
ดงชอเรมตนของไฟล
$name = Input::file('photo')->getClientOriginalName();
ดงคาขนาดของไฟล
$size = Input::file('photo')->getSize();
ดงนามสกลของไฟล
$mime = Input::file('photo')->getMimeType();
Request Informationคลาส Requestของ laravel สบทอดมาจากคลาส Symfony\Component\HttpFoundation\Request ตอไปนคอฟงกชนสาคญครบ
ดงคา URI จากการเรยกครงลาสด
$uri = Request::path();
ตรวจสอบวาคารองขอทสงเขามาตรงกบกฏทเราตงไวไหม
if (Request::is('admin/*')){ //}
121
www.laravetut.com เรยนร laravel แบบเจาะลก
ดงคา url ของคารองขอ
$url = Request::url();
ดงคา URI เฉพาะสวน
$segment = Request::segment(1); // http::/thailaravel.com/admin/post/id?=3// $sengment = admin
ดงคา header
$value = Request::header('Content-Type');
ดงคาจากตวแปร $_SERVER
$value = Request::server('PATH_INFO');
ตรวจวาคาขอเปน ajax ไหม
if (Request::ajax()){ //}
ตรวจวาคาขอมาจาก https ไหม
if (Request::secure()){ //}
122
www.laravetut.com เรยนร laravel แบบเจาะลก
Responses ( คลาสทใชจดการสงขอมลกลบ )บทนจะมาพดถงคลาส views กบ Response นะครบ
Basic Responsesการสงคาคนแบบงายๆ
Route::get('/', function(){ return 'Hello World';});
สรางการสงกลบเอง
คลาส Response สบทอดมาจากคลาส Symfony\Component\HttpFoundation\Response เราจะมาดเฉพาะเมทอดทสาคญกนนะครบ
ตวอยางการสรางคาตอบกลบนะครบ
$response = Response::make($contents, $statusCode);
$response->header('Content-Type', $value);
return $response;
เพม cookie ลงไปในคาตอบกลบ
$cookie = Cookie::make('name', 'value');
return Response::make($content)->withCookie($cookie);
Redirects การสงกลบสงกลบไปท route
return Redirect::to('user/login');
123
www.laravetut.com เรยนร laravel แบบเจาะลก
สงกลบไปพรอมกบ ขอความ
return Redirect::to('user/login')->with('message', 'Login Failed');
สงกลบไปท route ทมชอยอตามตวอยาง
return Redirect::route('login');
สงกลบไปท route ทมชอยอตามตวอยางพรอมกบคา
return Redirect::route('profile', array(1));
สงกลบไปท route ทมชอยอตามตวอยางพรอมกบตวแปร
return Redirect::route('profile', array('user' => 1));
สงกลบไปทฟงกชนใน controller
return Redirect::action('HomeController@index');
สงกลบไปทฟงกชนใน controller พรอมกบพารามเตอร
return Redirect::action('UserController@profile', array(1));
สงกลบไปทฟงกชนใน controller พรอมกบตวแปร
return Redirect::action('UserController@profile', array('user' => 1));
การสงกลบแบบพเศษสรางการสงกลบในรปแบบของ json
return Response::json(array('name' => 'Steve', 'state' => 'CA'));
124
www.laravetut.com เรยนร laravel แบบเจาะลก
สรางการสงกลบในรปแบบของ jsonp
return Response::json(array('name' => 'Steve', 'state' => 'CA'))->setCallback(Input::get('callback'));
สรางการสงกลบในรปแบบของการดาวนโหลดไฟล
return Response::download($pathToFile);
return Response::download($pathToFile, $name, $headers);
Response Macrosสงทเพมเขามาใน 4.1 คอ เมทอดResponse::macro เปนการสรางรปแบบคอการคนคา ในแบบทเราตองการ:
Response::macro('caps', function($value){ return Response::make(strtoupper($value));});
สวนการเรยกใชนน
return Response::caps('foo');
เราตองเกบคาสง ไวในไฟลทแยกออกมา แลวกเพมเขาไปในไฟล start.php เพอเรยกใชงานทกครง
125
www.laravetut.com เรยนร laravel แบบเจาะลก
Security ( คลาสทเกยวกบการเขารหส )คลาสนใชในการสรางระบบรกษาความปลอดภยตางอยางเชน การเขารหสเพอใชใน password,session,cookie
การเกบรหสผานClass Hash ของ laravel ใชสวนขยาย Bcrypt ของ php มาพฒนาตอยอด
การสรางคา hash
$password = Hash::make('secret');
การตรวจสอบคา hash
if (Hash::check('secret', $hashedPassword)){ // The passwords match...}
ตรวจวา password ตองการเขารหสอกครง กรณลมรหสผาน
if (Hash::needsRehash($hashed)){ $hashed = Hash::make('secret');}
การยนยนตวบคคลการลอกอน laravel เตรยมเมทอด Auth::attempt มาใหตวอยางการใชงาน
if (Auth::attempt(array('email' => $email, 'password' => $password))){ return Redirect::intended('dashboard');}
คา email เราสามารถเปลยนไปตามใจเราไดครบ สวนเมทอด Redirect::intended ใชสงผใชงานกลบไปทลงทเขาเรยกมาครบ
เมอเมทอด attempt ถกเรยก event auth.attempt จะถกเรยกและ event auth.login จะถกเรยกเมอการเขาสระบบสาเรจ
126
www.laravetut.com เรยนร laravel แบบเจาะลก
ตรวจสอบวามการลอกอนคางอยไหม
if (Auth::check()){ // The user is logged in...}
ตวอยางการปรบปรงเมทอด attempt ใหสามารถทาการจาชอผใชกบรหสผานได
if (Auth::attempt(array('email' => $email, 'password' => $password), true)){ // The user is being remembered...}
การกาหนดเงอนไขตอนลอกอน
if (Auth::attempt(array('email' => $email, 'password' => $password, 'active' => 1))){ // }
การเขาถงเขอมลคนทลอกอน
$email = Auth::user()->email;
ใชเมทอด loginUsingId เพอดง Id ของคนทลอกอนมา
Auth::loginUsingId(1);
สมมตวาเรากาหนดวาการเปลยนแปลงเลขบตรเครดตตองใชรหสผานยนยนเพมเตม เมทอด validate สามารถทางานนใหเราได
การใชงานการยนยนตวตนโดยไมไดเขาสระบบ
if (Auth::validate($credentials)){ //}
127
www.laravetut.com เรยนร laravel แบบเจาะลก
การลอกอนแบบไมม session หรอ cookies
if (Auth::once($credentials)){ //}
เมทอดทใชลอกเอาท
Auth::logout();
การจาลองการลอกอนการลอกอนแบบ ทเราจาลองขนมาเองครบ เมทอดlogin ใชคาจากฐานขอมลมาลอกอนไดทนทเลย
$user = User::find(1);
Auth::login($user);
การปองกน CSRF
ทาการแนบคา token เขากบฟอรม
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
ตรวจสอบคา token ทถกสงมา
Route::post('register', array('before' => 'csrf', function(){ return 'You gave a valid CSRF token!';}));
128
www.laravetut.com เรยนร laravel แบบเจาะลก
HTTP Basic Authenticationlaravel เตรยม filter ชอ auth.basic เพอตรวจวา มการลอกอนไหม
ตวอยาง
Route::get('profile', array('before' => 'auth.basic', function(){ // Only authenticated users may enter...}));
โดยคาเรมตนเเลวเมทอด basic ใชคอลมน email ในการตรวจสอบ ถาเราจะเปลยนกใช
return Auth::basic('username');
laravel เตรยมฟงกชน Oncebasic มาเพอการลอกอนแบบไมสราง session ไวเหมาะกบการให ผใชงานใชในกรณไปลอกอนเครองทไมใชของตวเอง
ตวอยาง
Route::filter('basic.once', function(){ return Auth::onceBasic();});
การจดการการลมรหสผานการลมรหสผานและการสรางใหม
สงรหสผานใหม
laravel เตรยมการมาใหเราสามารถสรางระบบการสและเปลยนรหสผาน ใหเราโดยการให User model ทาการสบทอดIlluminate\Auth\Reminders\RemindableInterface.
129
www.laravetut.com เรยนร laravel แบบเจาะลก
การใชงาน RemindableInterface
class User extends Eloquent implements RemindableInterface {
public function getReminderEmail() { return $this->email; }
}
ตอมาเรากตองสรางตารางใหระบบลมรหสผานกอนโดย php artisan auth:reminders
สรางตว migration ของตารางลมรหส
php artisan auth:reminders
php artisan migrate
การสงรหสใชเมทอด Password::remind
ตวอยางการใชงาน
Route::post('password/remind', function(){ $credentials = array('email' => Input::get('email'));
return Password::remind($credentials);});
หมายเหต: เราตองสราง view ทชอ auth.reminder.emailเพอรบ email เองนะครบ
เราสามารถสงขอความเพมเตมใหผใชโดยสงพารามเตอรไป $message ไปในฟงกชน remind
return Password::remind($credentials, function($message, $user){ $message->subject('Your Password Reminder');});
130
www.laravetut.com เรยนร laravel แบบเจาะลก
โดยคาเรมตนเเลวเมทอด remind จะสงกลบมาทหนาทเรยกใช ถาเกดขอผดพลาดขน ตวแปร errorจะมคาขนใน session สวนเมอสาเรจตวแปรsuccess กจะปรากฏขนมาใน session แทน หนาตาของหนา auth.reminder.email ควรเปนแบบนครบ
@if (Session::has('error')) {{ trans(Session::get('reason')) }}@elseif (Session::has('success')) An e-mail with the password reset has been sent.@endif
<input type="text" name="email"><input type="submit" value="Send Reminder">
การรเซตรหสผาน
การสราง route เพอรบการทผใชงานกดลงทาการรเซตรหสผาน
Route::get('password/reset/{token}', function($token){ return View::make('auth.reset')->with('token', $token);});
หนา view ททาการใหผใชงานทาการเปลยนรหสผาน
@if (Session::has('error')) {{ trans(Session::get('reason')) }}@endif
<input type="hidden" name="token" value="{{ $token }}"><input type="text" name="email"><input type="password" name="password"><input type="password" name="password_confirmation">
131
www.laravetut.com เรยนร laravel แบบเจาะลก
ตวอยางการสราง route เพอทาการรบคารหสผานใหม
Route::post('password/reset/{token}', function(){ $credentials = array('email' => Input::get('email'));
return Password::reset($credentials, function($user, $password) { $user->password = Hash::make($password);
$user->save();
return Redirect::to('home'); });});
ถาการเปลยนรหสผานสาเรจ User instance และรหสผานใหมจะถกเกบลงฐานขอมลและ สงกลบไปหนา home
EncryptionLaravel เตรยมการเขารหสแบบ AES-256 โดยสวนเสรม mcrypt ของ PHP มาใหเเลว
กาเขารหส
$encrypted = Crypt::encrypt('secret');
Note: มนใจวาเราเปลยนคา key ตรงท app/config/app.php ไมงนการเขารหสจะไมคอยปลอดภยครบ
การถอดรหส
$decrypted = Crypt::decrypt($encryptedValue);
การกาหนดรปแบบตางๆ
Crypt::setMode('ctr');
Crypt::setCipher($cipher);
132
www.laravetut.com เรยนร laravel แบบเจาะลก
Session ( คลาสทใชจดกาาร Session )
การตงคาเบองตนไฟลทใชตงคาจะอยท app/config/session.php.โดยชนดของ session จะมหลายชนดนะครบแตโดยเรมตนแลวจะเปน native สวนการตงคาอนๆกจะเปนเวลาทจะให seesion มชวตอย ทอยของ seesion ชอของ cookie และอนๆ ครบ
การใชงานการสรางคาแลวเกบใน session
Session::put('key', 'value');
ดงคาจาก Session
$value = Session::get('key');
ดงคาเรมตนของ session
$value = Session::get('key', 'default');
$value = Session::get('key', function() { return 'default'; });
ตรวจวามคานใน Session หรอไม
if (Session::has('users')){ //}
ลบคาออกจาก Session
Session::forget('key');
ลบคาทงหมด Session
Session::flush();
133
www.laravetut.com เรยนร laravel แบบเจาะลก
สราง Session ID อกครง
Session::regenerate();
Flash Dataหลายๆครงเราตองฝากคาไวใน session เพอนาไปใชในการทางานตอไป สามารถใชเมทอด Session::flash ตวอยาง
Session::flash('key', 'value');
ทาการเรยกใช falsh message อกครง
Session::reflash();
ทาการเรยกใชงานอกครงเฉพาะคา
Session::keep(array('username', 'email'));
การเกบ session ในฐานขอมลเมอเราใชฐานขอมลเกบ session เราตองสรางตารางขนมากอน ดวยคาสงSchema ดงตวอยาง
Schema::create('sessions', function($table){ $table->string('id')->unique(); $table->text('payload'); $table->integer('last_activity');});
ตอนนเรากใชคาสง php artisab session:table เปนอนจบครบ
134
www.laravetut.com เรยนร laravel แบบเจาะลก
Cookiesการดงคาจาก cookies
$value = Cookie::get('name');
สราง cookie และสงคนไปใหผใชงาน
$response = Response::make('Hello World');
$response->withCookie(Cookie::make('name', 'value', $minutes));
สราง cookie ทไมหมดอาย
$cookie = Cookie::forever('name', 'value');
ประเภทของ sessionfile - sessions จะถกเกบไวใน app/storage/sessions.cookie - sessions เกบไวใน cookies ทเขารหสdatabase - sessions เกบไวในฐานขอมลmemcached / redis - sessions เกบไวใน memoryarray - เกบไวใน php array
135
www.laravetut.com เรยนร laravel แบบเจาะลก
SSH ( คลาสททใชจดการ ftp และ git)
การตงคาไปทไฟล app/config/remote.php, เราตองตงคาอาเรย connections ซงใชกาหนดคาตางๆ ในการเชอมตอ connections
การใชงานเบองตน
เรยกใช
เราใชเมทอด SSH::run เบองตน
SSH::run(array( 'cd /var/www', 'git pull origin master',));
เรยกใชพรอมกบใชคาสงเพมเตม
เราจะใชเมทอด into เพอเรยกใชคาสง stagging ของ git:
SSH::into('staging')->run(array( 'cd /var/www', 'git pull origin master',));
แคชผลของคาส งเพอความรวดเรว
ใชเมทอด run แลวใสฟงกชนเขาไป:
SSH::run($commands, function($line){ echo $line.PHP_EOL;});
136
www.laravetut.com เรยนร laravel แบบเจาะลก
Tasks
ถาเราตองการใชคาสงทละหลายๆ ตว สามารถทาไดโดยใชเมทอด define เชน ในตวอยางเราตงชอ ชดคาสงวา deploy :
SSH::into('staging')->define('deploy', array( 'cd /var/www', 'git pull origin master', 'php artisan migrate',));
ขางบนเปนการประกาศ ขางลางเปนการเรยกใชครบ
SSH::into('staging')->task('deploy', function($line){ echo $line.PHP_EOL;});
SFTP Downloadsการดาวนโหลดไฟลนน จะใชเมทอด get ในแลวใสทอยบน FTP กบ บนเครองของเราไป
SSH::into('staging')->get($remotePath, $localPath);
$contents = SSH::into('staging')->getString($remotePath);
SFTP Uploadsสวนการอพโหลดไฟลนน ใชเมทอด putในการอพโหลด และ putString ในการกาหนดทอย
SSH::into('staging')->put($localFile, $remotePath);
SSH::into('staging')->putString($remotePath, 'Foo');
137
www.laravetut.com เรยนร laravel แบบเจาะลก
Tailing Remote Logsคอการดาวนโหลดไฟล laravel.log ซงเปนไฟล log นนเอง ขางลางเปน ตวอยางการใชงานครบ
php artisan tail staging
php artisan tail staging --path=/path/to/log.file
138
www.laravetut.com เรยนร laravel แบบเจาะลก
Unit TestingLaravel สรางขนมาดวยแนวคดของการทดสอบเปนเบองตนอยเเลวครบ โดยหลกแลวจะสนบสนนไลบราล PHPUnit เปนพนฐาน และphpunit.xmlไฟลไดถกเตรยมการเอาไวใหแลว. Laravel เตรยมคลาส Symfony HttpKernel, DomCrawler, และ BrowserKit componentsทอนญาตใหเราจาลองบราวเซอรขนมาเเละเขาไปแกไขไฟล html ได ตวอยางไฟลอยทโฟลเดอร app/tests
Defining & Running Testsการสรางไฟลสาหรบทดสอบนนเราจะไปสรางทโฟลเดอร app/tests สรางคลาสทสบทอดคลาส TestCase.
ตวอยางคลาสสาหรบใชทดสอบ
class FooTest extends TestCase {
public function testSomethingIsTrue() { $this->assertTrue(true); }
}
เราจะทาการทดสอบโดยรน phpunit บน commandline
หมายเหต: ถาคณประกาศเมทอด setUp มนใจวาไดเรยก parent::setUpแลว
สภาวะการตงคาสาหรบการทดสอบเมอใชงาน unit tests, Laravel จะทาการเปลยนการสภาวะการตงคาใหไปเปน testing. และจะตดการทางานของ session และ cacheหมายความวาจะไมมแคชและ session เกดขนระหวางการทดสอบ
139
www.laravetut.com เรยนร laravel แบบเจาะลก
การเรยก Routes ในขณะทดสอบตวอยางการเรยก Route ในขณะทากาารทดสอบ
$response = $this->call('GET', 'user/profile');
$response = $this->call($method, $uri, $parameters, $files, $server, $content);
เราสามารถตรวจสอบออปเจค Illuminate\Http\Response
$this->assertEquals('Hello World', $response->getContent());
ตวอยางการเรยก Controller ในขณะทดสอบ
$response = $this->action('GET', 'HomeController@index');
$response = $this->action('GET', 'UserController@profile', array('user' => 1));
เมทอด getContent จะสงคาเปนตวอกษรกลบคนมา View เราสามารถเขาถงไดดวยตวแปร original
$view = $response->original;
$this->assertEquals('John', $view['name']);
ถาจะเรยก HTTPS route,เราตองใชเมทอดcallSecure
$response = $this->callSecure('GET', 'foo/bar');
DOM Crawler
คลาส DOM Crawler ทาใหเราสามารถตรวจสอบ html ทถกสรางขนมาระหวางการทดสอบได ตวอยางการใช
$crawler = $this->client->request('GET', '/');
$this->assertTrue($this->client->getResponse()->isOk());
$this->assertCount(1, $crawler->filter('h1:contains("Hello World!")'));
140
www.laravetut.com เรยนร laravel แบบเจาะลก
Mocking Facadesเมอเราทาการทดสอบ,เราจะทาการจาลองในการเรกคลาส Facade ตวอยางเราจะทาการเรยก controller
public function getIndex(){ Event::fire('foo', array('name' => 'Dayle'));
return 'All done!';}
เราสามารถจาลองคลาสEventโดยใชเมทอด shouldReceive
การจาลองคลาส Facade
public function testGetIndex(){ Event::shouldReceive('fire')->once()->with(array('name' => 'Dayle'));
$this->call('GET', '/');}
หมายเหต: คณไมควรจาลองคลาส Facade Request ใชเมทอด call ดกวาครบ
Framework Assertionsเมทอด assert ใชในการตรวจสอบวาคาทออกมาตรงกบทเราคาดหวงไวไหม
คาดหวงวาคาทสงมาจะไมผดพลาด
public function testMethod(){ $this->call('GET', '/');
$this->assertResponseOk();}
คาดหวงวาจะเปน 403
$this->assertResponseStatus(403);
141
www.laravetut.com เรยนร laravel แบบเจาะลก
คาดหวงวาฟงกชนจะสงกลบไปท route
$this->assertRedirectedTo('foo');
$this->assertRedirectedToRoute('route.name');
$this->assertRedirectedToAction('Controller@method');
คาดหวงวาในหนา view จะมคา
public function testMethod(){ $this->call('GET', '/');
$this->assertViewHas('name'); $this->assertViewHas('age', $value);}
คาดหวงวาใน session จะมคา
public function testMethod(){ $this->call('GET', '/');
$this->assertSessionHas('name'); $this->assertSessionHas('age', $value);}
Helper Methodsคลาส TestCase มเมทอดชวยใหเราทาการทดสอบไดงายๆ เยอะเลยครบ.
เมทอด beใชในการจาลองการลอกอน
ตวอยาง
$user = new User(array('name' => 'John'));
$this->be($user);
142
www.laravetut.com เรยนร laravel แบบเจาะลก
Validation ( การตรวจสอบขอมล )คอการตรวจสอบคาตางๆ ทปอนเขามา หรอระหวางการทางานของฟงกชนตางๆ โดยจะแสดงขอผดพลาดใหเราดวย โดยคลาสททาหนาทนนชอValidator ครบ
การใชงานเบองตนการใชงานคลาส validator
$validator = Validator::make( array('name' => 'Dayle'), array('name' => 'required|min:5'));
อาเรยตวแรกคอขอมลทเราจะทาการตรวจนนเอง ตวทสองคอรปแบบทเราตองการการใชเครองหมาย | การตรวจสอบออกเปนหลายๆ แบบ
ใชอาเรยในการกาหนดกฏ
$validator = Validator::make( array('name' => 'Dayle'), array('name' => array('required', 'min:5')));
คลาส Validator จะสรางเมทอด ชอ fails (หรอ passes) เพอตรวจสอบผล
if ($validator->fails()){ // The given data did not pass validation}
ถาไมผานเราสามารถดงขอความแสดงขอผดพลาดได.
$messages = $validator->messages();
เมทอด failed ใชในการเขาถงกฏทเราตงไว
$failed = $validator->failed();
143
www.laravetut.com เรยนร laravel แบบเจาะลก
การจดการขอความแสดงขอผดพลาดเมอเรยกเมทอด messages บนตว Validator instance,เราจะไดรบ MessageBag instance ทจะมเมทอดใหเราจดการขอความ
แสดงขอความแสดงขอผดพลาดเฉพาะตวแรก
echo $messages->first('email');
รบขอความแสดงขอผดพลาดทงหมด
foreach ($messages->get('email') as $message){ //}
รบขอความแสดงขอผดพลาดจากทกคอลมน
foreach ($messages->all() as $message){ //}
ตรวจวามขอความแสดงขอผดพลาดจากคอลมน eamil ไหม
if ($messages->has('email')){ //}
รบขอความแสดงขอผดพลาดโดยใสรปแบบใหดวย
echo $messages->first('email', '<p>:message</p>');
หมายเหต: โดยเรมตน, รปแบบขอความจะถกจดในรปแบบทนาไปใชงานรวมกบ twiiter bootstrap ได.
144
www.laravetut.com เรยนร laravel แบบเจาะลก
รบขอความแสดงขอผดพลาดทงหมดพรอมใสรปแบบ
foreach ($messages->all('<li>:message</li>') as $message){ //}
การแสดงขอความแสดงขอผดพลาดบน viewตวอยางนเราจะสงขอความแสดงขอผดพลาด ไปให view
Route::get('register', function(){ return View::make('user.register');});
Route::post('register', function(){ $rules = array(...);
$validator = Validator::make(Input::all(), $rules);
if ($validator->fails()) { return Redirect::to('register')->withErrors($validator); }});
ถาการตรวจสอบไมผานเราจะใชเมทอด withErrors สงขอความแสดงขอผดพลาดขนไปบน View ดวย
ไมควรสงขอความแสดงขอผดพลาด ไปบน Route ทเปน method GET เพราะ laravel จะตรวจสอบขอผดพลาดบน session ทกคารองขอ
เมอทาการรไดเรคเราสามารถเขาถงขอความแสดงขอผดพลาด โดยใชตวแปร$errors ดงตวอยางครบ
<?php echo $errors->first('email'); ?>
145
www.laravetut.com เรยนร laravel แบบเจาะลก
กฏในการตรวจสอบท laravel เตรยมไว
accepted
คาทจะผานคอ yes, on, or 1.เหมาะสาหรบใชในการตรวจสอบวายอมรบ "Terms of Service" ไหม
active_url
ตรวจสอบวาลงตายยง โดยใช checkdnsrr ซงเปน PHP function.
after:date
ตรวจสอบวาคาทสงมาเปนมรปแบบของเวลาหลกจากใช strtotime อยหลงสดแปลงไหม
alpha
ตรวจสอบวาคาทสงมาเปนรปแบบของตวอกษรตางๆ ไหม
alpha_dash
ตรวจสอบวาคาทสงมาเปนรปแบบของตวเลขทมเครองหมาย _ รวมอยดวยไหม
alpha_num
ตรวจสอบวาคาทสงมาเปนรปแบบของตวเลขไหม
before:date
ตรวจสอบวาคาทสงมาเปนมรปแบบของเวลาหลกจากใช strtotime อยหนาสดไหม
between:min,max
ตรวจสอบวาคาทสงมาเปนมคาอยระหวาง min กบ max ไหม
confirmed
ตรวจสอบวาคาทสงมาเปนมรปแบบของฟอรมทมรปแบบ ชอ_confirmation ยกตวอยางการตรวจสอบ password,วาตรงกบpassword_confirmation ไหม
146
www.laravetut.com เรยนร laravel แบบเจาะลก
date
ตรวจสอบวาคาทสงมาเปนมรปแบบของเวลาหลกจากใช strtotime ไหม.
dateformat:_format
ตรวจสอบวาคาทสงมาเปนมรปแบบของเวลาทกาหนดไหม
different:field
คาตรง field ตองมคาตางจากคาทปอนเขามาถงจะผาน
ตรวจสอบวาคาทสงมาเปนมรปแบบของ email
exists:table,column
ฟอรมทอยในการตรวจสอบตองมชอตรงกบคอลมนในฐานขอมล
การใชงานเบองตน
'state' => 'exists:states'
การใชงานโดยใสคาทตองการตรวจไปหลายคา
'state' => 'exists:states,abbreviation'
เราสามารถกาหนดเงอนไขใหกฏคลายๆการทาควร ครบ
'email' => 'exists:staff,email,account_id,1'
image
ตรวจสอบวาคาทสงมาเปนรปภาพมนามสกล(jpeg, png, bmp, or gif) ไหม
in:foo,bar,...
ตรวจสอบวาคาทสงมามคาตรงกบคาใน foo,bar ไหม
integer
147
www.laravetut.com เรยนร laravel แบบเจาะลก
ตรวจสอบวาคาทสงมามรปแบบของเลขจานวนเตมไหม
ip
ตรวจสอบวาคาทสงมามรปแบบของ IP address.
max:value
ตรวจสอบวาคาทสงมามคานอยกวาคาทกาหนดไว
mimes:foo,bar,...
ตรวจสอบวาคาทสงมามรปแบบของ mime type ตรงกบทกาหนดไหม
ตวอยางการตรวจสอบนามสกลของไฟล
'photo' => 'mimes:jpeg,bmp,png'
min:value
ตรวจสอบวาคาทสงมามจานวนนอยกวาไหมถามนอยกวากไมผาน
notin:_foo,bar,...
ตรวจสอบวาคาทสงมามคาตรงกบคาทตงไวไหม ถามกไมผานครบ
numeric
ตรวจสอบวาคาทสงมาเปนตวเลขไหม
regex:pattern
ตรวจสอบวาคาทสงมามรปแบบกบ regular expression ทกาหนดไวไหม
required
ตรวจสอบวาคาทสงมาเปนคาวางไหม ถาเปนกไมผานครบ
148
www.laravetut.com เรยนร laravel แบบเจาะลก
requiredif:_field,value
ตรวจวาคาใน field ตองไมวางและ ตรงกบ value
requiredwith:_foo,bar,...
ตรวจวาฟล foo ตองมคาหาก bar มคาดวย
requiredwithout:_foo,bar,...
ตรวจวาฟล foo ตองมคาหาก bar ไมมคา
same:field
ตรวจวาคาทสงเขามาซ ากบคาทกาหนดไวไหม
size:value
ตรวจวาคาทสงเขามาตรงกบทกาหนดไวไหม กรณเปนคาจะตรวจสอบจานวนคา เปนตวเลขกเทยบตามคา เปไฟลเทยบตามขนาดของไฟลเปนกโลไบต
unique:table,column,except,idColumn
ตรวจวาคาทสงมาซ ากบในตารางไหม.
ตวอยางการใชตรวจวาอเมลนมในตาราง user ไหม
'email' => 'unique:users'
ตวอยางการใชตรวจวาอเมลนมในตาราง user ตรงคอลมน email-address ไหม
'email' => 'unique:users,email_address'
ตวอยางการใชตรวจวาอเมลนมในตาราง user ตรงคอลมน email-address ไหม โดยไมสนใจ id ทมคาเทากบ 10
'email' => 'unique:users,email_address,10'
url
ตรวจวาคาเปน url ไหม
149
www.laravetut.com เรยนร laravel แบบเจาะลก
การกาหนดขอความแสดงขอผดพลาดเองเราสามารถปรบแตงขอความทแสดงขอผดพลาดได
ตวอยาง
$messages = array( 'required' => 'The :attribute field is required.',);
$validator = Validator::make($input, $rules, $messages);
การใชขอความทเรากาหนดรวมกบ Place-Holders
$messages = array( 'same' => 'The :attribute and :other must match.', 'size' => 'The :attribute must be exactly :size.', 'between' => 'The :attribute must be between :min - :max.', 'in' => 'The :attribute must be one of the following types: :values',);
กาหนดขอความใหแตละคอลมนเลย
$messages = array( 'email.required' => 'We need to know your e-mail address!',);
บางกรณเราตองการกาหนดขอความทแสดงใหเปนเฉพาะแตละภาษาไป ซงเราตองไปเพมทอาเรยชอ custom ใน app/lang/xx/validation.php ตามภาษาทไป
ควอยาง
'custom' => array( 'email' => array( 'required' => 'We need to know your e-mail address!', ),),
150
www.laravetut.com เรยนร laravel แบบเจาะลก
การสรางตวตรวจสอบเราสามารถสรางฟงกชนในการตรวจสอบไดเองโดย laravel เตรยมเมทอด Validator::extend มาเพอการนนครบ
ตวอยาง
Validator::extend('foo', function($attribute, $value, $parameters){ return $value == 'foo';});
ตวอยางขางบนเรารบตวแปรมาสามตวครบ $attribute คอชอขอมลทจะตรวจ $value คาของขอมล $parameters คาอนๆ
You may also pass a class and method to the extend method instead of a Closure:
Validator::extend('foo', 'FooValidator@validate');
มอกวธในการสรางคลาสของเราเองโดยการสบทอด Illuminate\Validation\Validator ทนฟงกชนตองมคาวา validateนาหนาดวยนะครบ
ตวอยาง
<?php
class CustomValidator extends Illuminate\Validation\Validator {
public function validateFoo($attribute, $value, $parameters) { return $value == 'foo'; }
}
151
www.laravetut.com เรยนร laravel แบบเจาะลก
ตอมาเราตองเอาคลาสของเรามาลงทะเบยน
Validator::resolver(function($translator, $data, $rules, $messages){ return new CustomValidator($translator, $data, $rules, $messages);});
เราสามารถสรางเมทอดทใชในการแสดงขอผดพลาดโดยตามรปแบบนครบ replaceXXX ตามตวอยาง
protected function replaceFoo($message, $attribute, $rule, $parameters){ return str_replace(':foo', $parameters[0], $message);}
152
www.laravetut.com เรยนร laravel แบบเจาะลก
Localization ( การทาหลายภาษา )
แนะนาคลาส Lang จะทาหนาทแปลภาษาในเบองตนใหกบเมนหรอปายกาหบตางๆ ในเวบของเรา
ไฟลทเกบขอมลภาษาถกเกบไวทโฟลเดอร app/lang โดยโครงสรางจะเปนแบบน
/app /lang /en messages.php /es messages.php
ไฟลทเกบภาษาจะเกบในรปแบบอาเรย:
ตวอยางของไฟลภาษา
<?php
return array( 'welcome' => 'Welcome to our application');
โดยคาเรมตนเเลว คาภาษาจะถกกาหนดไวท app/config/app.php แตถาจะตงเราจะตงแบบไมใหคลมไปทงเวบกใชเมทอด App::setLocale
ตวอยาง
App::setLocale('es');
153
www.laravetut.com เรยนร laravel แบบเจาะลก
การใชงานเบองตนการดงคาจากไฟลภาษา
echo Lang::get('messages.welcome');
ฟงกชน get ใชดงคาโดยมพารามเตอรคอชอภาษาและแถวทตองการดง
การสงพารามเตอรไป
พารามเตอรทสองจะใชรบคาทจะสงมา
'welcome' => 'Welcome, :name',
ตวอยางการใชงาน
echo Lang::get('messages.welcome', array('name' => 'Dayle'));
ตรวจวาในไฟลภาษามคอลมนนอย
if (Lang::has('messages.welcome')){ //}
PluralizationPluralization คอโครงสรางไวยากรณของแตละภาษาทมความแตกตางกน แตเราใชเครองหมาย ในการสรางตวเลอกระหวางเอกพจนกบพหพจน:
'apples' => 'There is one apple|There are many apples',
เเลวเรากใชฟงกชน Lang::choice ในการเลอก
echo Lang::choice('messages.apples', 10);
เนองจากการแปลภาษาของ laravel สบทอดมาจากของ Symfony เราจงสามารถสรางเงอนไขทซบซอนดงตวอยางได
'apples' => '{0} There are none|[1,19] There are some|[20,Inf] There are many',
154
www.laravetut.com เรยนร laravel แบบเจาะลก
155
www.laravetut.com เรยนร laravel แบบเจาะลก
Mail ( การสงเมล )
การตงคาLaravel นาไลบราล SwiftMailer มาใชงาน การตงคาอยท app/config/mail.php,โดยจะใหเราเปลยน SMTP host, port, และ username กบpassword, แลวกคา from คอคาเรมตนของชอผรบ. ถาเราตองการใชไลบราร php mail ในการสงกเพยงเปลยน driver เปน mail
การใชงานเบองตนฟงกชน Mail::send ใชในการสงอเมล
Mail::send('emails.welcome', $data, function($message){ $message->to('[email protected]', 'John Smith')->subject('Welcome!');});
เมทอด send ตวแปรแรกคอไฟล html ทเปนรปแบบขอมความในเมล. ตวทสองคอขอมลทจะเขยนลงเมล $data ซงจะถกสงไปยง viewตวทสามเปนฟงกชนทใชกาหนดคาตางๆของอเมล
Note: ตวแปร $message คอออปเจคของตว Swiftmailer class ซงเราจะใชกาหนดคาตางๆของเมล
Mail::send(array('html.view', 'text.view'), $data, $callback);
ตวอยางคอเราเลอกทจะสงไปในรปแบบใด html หรอ text
Mail::send(array('text' => 'view'), $data, $callback);
ตวอยางการปรบแตงเนอหาภายในเมล:
Mail::send('emails.welcome', $data, function($message){ $message->from('[email protected]', 'Laravel');
$message->to('[email protected]')->cc('[email protected]');
$message->attach($pathToFile);});
156
www.laravetut.com เรยนร laravel แบบเจาะลก
เมอจะทาการแนบไฟลเราตองใสนามสกลกบชอใหมนดวย:
$message->attach($pathToFile, array('as' => $display, 'mime' => $mime));
การแทรกไฟลไวระหวางบรรทดเราสามารถแนบรปไปโดยไมใหเเสดงไดโดยใชฟงกชน embed
ตวอยางการใชงาน
<body> Here is an image:
<img src="<?php echo $message->embed($pathToFile); ?>"></body>
เรยงลาดบการสงอเมลในการสงอเมลจานวนมากนนเรา ตองทาการเรยงลาดบการสง เพอการนน laravel เตรยมคลาส Queueมาใหเราใชในการเรยงลาดบการสงอเมลแลวครบ
ตวอยาง
Mail::queue('emails.welcome', $data, function($message){ $message->to('[email protected]', 'John Smith')->subject('Welcome!');});
เราสามารถหนวงเวลาการสงโดยใชฟงกชน later ตามตวอยางครบ
Mail::later(5, 'emails.welcome', $data, function($message){ $message->to('[email protected]', 'John Smith')->subject('Welcome!');});
157
www.laravetut.com เรยนร laravel แบบเจาะลก
ถาเรามหลายคว มฟงกชนใหเราเรยงควอก คอ queueOn และ laterOn
Mail::queueOn('queue-name', 'emails.welcome', $data, function($message){ $message->to('[email protected]', 'John Smith')->subject('Welcome!');});
Mail & Local Developmentในการพฒนานน เรายงไมตองใชงานเมลจรงๆในการสงกได laravel เตรยมฟงกชน Mail::pretend หรอตงคา pretend ใน app/config/mail.phpเปน true. เพอเขาส pretend mode ขอความบนเมลทถกสงจะถกเขยนบนลอกแทย
158
www.laravetut.com เรยนร laravel แบบเจาะลก
การดงคาของการตงคาหลกมาใชสวนการตงคาหลกๆ ของเวบเราจะอยทโฟลเดอร app/config ในบทนเราจะมาดวา laravel เตรยมฟงกชนอะไรใหเราใชในการดงคาจากไฟลทงหลายในโฟลเดอร config ออกมาใชไดบาง.
laravel เตรยม class ทชอวา Config ไวใหเราเเลวนะครบ
ยกตวอยางการดงคา timezone ออกมา
Config::get('app.timezone');
เราสามารถกาหนดคาของตวแปรนนใหมได กรณทรปแบบไมเปนไปตามทเราตองการ:
$timezone = Config::get('app.timezone', 'UTC');
สงเกตวาถาเปนการเขาถงคาในอาเรยของไฟล laravel จะใชเครองหมายดอท ในการเขาถงนะครบ
กาหนดคาแบบไมตองเขาไปในไฟลเลย
Config::set('database.default', 'sqlite');
การกาหนดคาแบบนจะไมไปเขยนทบการตงคาในไฟล app.php นะครบ แตจะเกดผลเฉพาะตรงทเราประกาศไวเทานน.
การกาหนดชดรปแบบของการตงคาพนฐานในการพฒนาเวบเรามกจะเปด การตงคาตางๆเพอทจะเอออานวยใหเราทราบขอมล ไดมากทสดแตในกรณทเวบออนไลนแลวการแสดง การแสดงขอมลการทางานผดพลาด การลมไปแลววาเคยทงคาสง debug ไวตรงไหน
เรมตนสรางไฟลชดการตงคาในโฟลเดอร config ยกตวอยางชอ local.ยกตวอยางการตงคาในไฟล สมมตเราตองการใชแคชแบบ fileกทาแบบตวอยางเลยครบ
<?php
return array(
'driver' => 'file',
);
159
www.laravetut.com เรยนร laravel แบบเจาะลก
Note: testing เปนชอทถกกาหนด ไวกบ laravel แลววาถาอยในชอนการตงคาทงหมดจะอยในการโหมด unit test ฉะนนเราอยาไปตงทบมนเลยครบ
สวนการตงคาทเราไมไดตงไว จะอางองกลบไปทไฟลหลกนะครบ
ตอมาเราตองไปตงคาใหตว laravel รวาขณะนอยในโหมดไหน โดยเขาไปตงคาท bootstrap/start.php ตวโฟลเดอรจะอยขางหนาสดเลย.เขาไปคนหา $app->detectEnvironment ตวฟงชนจะใชคนหารปแบบการตงคาของเวบเรา
<?php
$env = $app->detectEnvironment(array(
'local' => array('your-machine-name'),
));
เรากจะเปลยนใหเปนเหมอนตวอยาง
$env = $app->detectEnvironment(function(){ return $_SERVER['MY_LARAVEL_ENV'];});
ตวอยางการเรยกใช
$environment = App::environment();
การปรบปรงเวบไซตเมอเราตองการปดเวบเพอทาการปรบปรง เราจะกาหนดเมทอด App::down ไวท app/start/global.php ซงจะทาใหทกคารองถกพาไปทหนาทบอกวาตอนน เวบกาลงอยในสถานะปรบปรง.
ตองการทาใหรวดเรวขนกใช command line กได
php artisan down
up เปนคาสงใหเวบกลบไปอยในสถานะออนไลนอกครง
php artisan up
160
www.laravetut.com เรยนร laravel แบบเจาะลก
ถาตองการเปลยนหนาทใชในการแสดงผลกเขาไปตงคาทapp/start/global.php ตวอยาง
App::down(function(){ return Response::view('maintenance', array(), 503);});
161
www.laravetut.com เรยนร laravel แบบเจาะลก
Package Development ( การสรางสวนเสรม )
คาอธบายเบองตนPackages คอการนาไลบรารภายนอกเขามาใชงานใน laravel ซงสวนมากจะอยบน Packagist และสวนมากอกไมไดปรบแตงใหเขากบ frameworkไหนเปนพเศษซงตรงนเรากตอง ออกเเรงกนหนอยครบ ถาอยากจะม package เปนของเราเองสวน การตดตง package ถามาเขยนในนคงจะยาว ผมเลยเขยนไวทเวบแลว อยากรตองทาไงตองตามไปดเลยครบ
การสราง Packageสถานทๆ เราจะทาการพฒนาคอโฟลเดอรชอ workbench ครบ แตตอนแรกเราตองเขาไปตงคาทไฟล app/config/workbench.phpในไฟลนเราตองเปลยน name และ email ซง composer.json จะนาไปใสเวลาเราสราง package ขนมา
สรางโครงของ package ขนมาดวย CommandLine
php artisan workbench vendor/package --resources
parameter แรก vendor คอชอผพฒนา package คอชอของ package resources เปนพารามเตอรทบอกใหสราง migrations, views, config, ดวย
เมอคาสงขางบนทางาน packageของเราจะไปปรากฏทโฟลเดอร workbench ตอมาเราจะสราง ServiceProvider ซงการตงชอจะเปนแบบน[Package]ServiceProvider สวนการนาไปลงททะเบยนทไฟล app.php นนเสนทางของไฟลจะเปนแบบนครบTaylor\Zapper\ZapperServiceProvider ซงตองนาไปวางไวทอาเรยชอ providers
กอนทจะเรมพฒนา package ของเรา ควรมารจกโครงสรางของมนกอนครบ
162
www.laravetut.com เรยนร laravel แบบเจาะลก
โครงสรางของ packageโครงสรางโฟลเดอรของ package
/src /Vendor /Package PackageServiceProvider.php /config /lang /migrations /views/tests/public
เมอตามเขาไปดในโฟลเดอร src/dev_name/package_name จะเจอกบไฟล ServiceProviderกบโฟลเดอร config, lang, migrations, และ viewsซงจะเหมอนในตวโฟลเดอร app หลกของเราแตยอสวนลงมาครบ
Service Providersเรมแรกในไฟล Service Provider จะมฟงกชน boot และ register. ซงในนเราจะสามารถ ใสฟงกชนอะไรกไดทจะชวยจดการ package ของเรา เชนดงไฟล route เขามา,ใช IOC ดงคลาสอนเขามาชวยเพม event เขามาดกฟง
ฟงกชน register จะเรมทางานทนทเมอ package เรมทางาน, ถาเรา package ของเราตองการคลาสอนๆ ในการทางานรวมดวยตองใชเมทอด bootครบ
โดยคาเรมตนเเลวฟงกชน boot จะมคามาใหดงน
$this->package('vendor/package');// include another class on boot packageClassLoader::addDirectories(array( app_path().'/widgets' ));
ถาลบบรรทดแรกออกไปผลกคอ package ไมทางานครบ laravel จะไมรจก package นเลย
163
www.laravetut.com เรยนร laravel แบบเจาะลก
Package Conventionsตวอยางการเรยกใชงานคาตางๆใน package
เรยก view ของ package
return View::make('package::view.name');
เรยกคาของการตงคา
return Config::get('package::group.option');
หมายเหต: ถา package ของเราม migrations ควรใสชอ package เขาไปอยไฟลดวย เพอปองกนการเหมอนกบ packages อน
ขนตอนในการพฒนาพอสรางโปรเจคเสรจ เรากใชคาสง php artisan dump-autoload เพอสรางไฟลทบอกทอยของ package ของเราขนมา
ตวอยาง
php artisan dump-autoload
Package Routingการทจะโหลดไฟล route เขามาใชตองใชฟงกชน include ในฟงกชน boot ครบ
ตวอยางการดง route มาใชใน Service Provider
public function boot(){ $this->package('vendor/package');
include __DIR__.'/../../routes.php';}
หมายเหต:ถาตองการใช controller ดวยมนใจวามนตองถกเพมไวในไฟล composer.json ในสวน autoload
164
www.laravetut.com เรยนร laravel แบบเจาะลก
การตงคา Packageบาง package เราตองดงคาตางๆ เชน appid,appsecret มาใช โดยเรมตนไฟล config.php จะอยในตว package กรณทดงลงมาดวย composerแลวตดตงเสรจไฟล จะอยทโฟลเดอร /app/config/package
การเขาถงไฟล config
Config::get('package::file.option');
ตวพารามเตอรแรกคอชอของ package หลงจาก semicolon คอชอไฟล หลงเครองหมายดอทคอชอ อาเรย config.php. ถาโฟลเดอรทใชเกบไฟลconfig ของ package มไฟลเดยวกไมตองใสชอกไดครบ
ตวอยางกรณโฟลเดอรมไฟลเดยว
Config::get('package::option');
บางครงไฟลทตองใชใน package มนกดนไมไดอยใน package สามารถใชฟงกชน addNamespace ซงมอยในคลาส View, Lang, กบConfigดงตวอยางเลยครบ
View::addNamespace('package', __DIR__.'/path/to/views');
ทนเรากสามารถใชงานคลาส View ใน package ไดละ
return View::make('package::view.name');
การตดตงไฟลทจาเปน
เมอเราดาวนโหลดไฟล package มาดวย composer ตองนาไฟลโฟลเดอร config ของ package ออกมาใชกอน
ตวอยางการใชงาน
php artisan config:publish vendor/package
เมอคาสงทางานเสรจจะปรากฎอยท app/config/packages/vendor/package
165
www.laravetut.com เรยนร laravel แบบเจาะลก
การสรางประวตให packageเราสามารถทา migration ใหกบ package โดโดยใชพารามเตอร --bench ตามตวอยางเลยครบ
สราง migration ให package ในโฟลเดอร workbench
php artisan migrate:make create_users_table --bench="vendor/package"
สงให migration ของ package ทางาน
php artisan migrate --bench="vendor/package"
เมอพฒนาเสรจอยากจะลองใชงานจรงเองกอนเราตองใชพารามเตอร --packageเพอสง package ไปไวทโฟลเดอร vendor
ตวอยางคาสงการยาย package ไปไวท vendor
php artisan migrate --package="vendor/package"
Package Assetsบาง package จะมไฟล JavaScript, CSS, และ images.เราไมสามารถสรางลงโดยตรงจากโฟลเดอร vendor หรอ workbenchฉะนนเราตองยายไปไวท โฟลเดอร public
การยายไฟล css,js,image โดยใช commandline
php artisan asset:publish
php artisan asset:publish vendor/package
แตถา package ยงอยในโฟลเดอร workbench ตองใชคาสงนครบ
php artisan asset:publish --bench="vendor/package"
ตอนนโฟลเดอรจะถกสงไปไวท โฟลเดอรpublic/packages ตวอยางชอโฟลเดอร userscape/kudos ตวอยางเสนทางทอยpublic/packages/userscape/kudos.
166
www.laravetut.com เรยนร laravel แบบเจาะลก