คู่มือใช้งาน laravel 4 1 ฉบับแปล

Post on 06-Apr-2016

258 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

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' => 'foo@bar.com')); }

}

การทางานกใชคาสง 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 = 'john@foo.com';

$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 แบบเจาะลก

taqman
Typewriter
taqman
Typewriter
taqman
Typewriter

ความพเศษจรง ๆอยทเมอเราใช 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' => 'john@example.com', 'votes' => 0));

การเพมคาพรอมกบเพมคา id ดวย

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

หมายเหต: ถาใช PostgreSQL เมทอด insertGetId คาดหวงวาจะใชคอลมน "id" เปนตวทมนจะเพมให

การเพมหลายๆขอมล

DB::table('users')->insert(array( array('email' => 'taylor@example.com', 'votes' => 0), array('email' => 'dayle@example.com', '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', 'example@gmail.com');

หมายเหต: 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

ตรวจสอบวาคาทสงมาเปนมรปแบบของ 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('foo@example.com', '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('us@example.com', 'Laravel');

$message->to('foo@example.com')->cc('bar@example.com');

$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('foo@example.com', 'John Smith')->subject('Welcome!');});

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

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

157

www.laravetut.com เรยนร laravel แบบเจาะลก

ถาเรามหลายคว มฟงกชนใหเราเรยงควอก คอ queueOn และ laterOn

Mail::queueOn('queue-name', 'emails.welcome', $data, function($message){ $message->to('foo@example.com', '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 แบบเจาะลก

top related