คู่มือการใ ช้งาน Laravel 4 ฉบับแปล · PDF...
Transcript of คู่มือการใ ช้งาน Laravel 4 ฉบับแปล · PDF...
คมอการใชงาน Laravel 4 ฉบบแปล
Page 1 of 187
กอนอาน
เมอหลายเดอนกอนผมพยายามมองหา framework ตวใหมทจะมาใชแทน Cakephp มาเจอกบ Laravelเพราะเขาไปอานบทความใน nettut บอยเลยลองใชดเเลวพบวา โคดจานวนมากบท Cakephpสามารถยอเหลอไมกบรรทดบน Laravel และทสาคญมากสาหรบผม การทไมตองมาพมพ $this ทกครง มนสดยอดมากผมใหคะแนนเกาเตมสบ สาหรบเรองความงายในการอานโคด ผมนกถงสมมตถาเรานาเอาไปทาโปรเจคขนาดใหญการทโคดอานงายมาก แคอานคมอเสรจ แลวมานงไลโคดทไดทาไวเเลว จะเปนอะไรทเรยนรไดเรวมาก แตขอเสยของ laravel กคอไมมระบบอตโนมตมาให Route กตองเขยนเอง UI กไมมตวสรางอตโนมตให
เนอหาตอไปนผมไดทาการแปล มาจากคมอหลกทอยบนเวบ ซงทาการแปลตามคาอธบาย และเสรมความเขาใจตามทผมไดทดลองทามาหลายเดอน และบางหวขอ ในหนงสอนเปนเรองหลกการของ php 5.3 ทงเรองnamespace,reflectionclass สาหรบคนทไมเคยรมากอนอาจ จะงงเหมอนผม ในตอนแรก ซงจะเขยนไวในนกจะยาวไปเพอการนนผมจงไดทาการอธบายเพมเตมไวท blog ของผม ในหนงสอน อาจมขอผดพลาดมากมายซงผมอยากใหใครทเหนขอผดพลาด ชวยทาการแจงใหผมทราบ หรอเขาไปชวยกนแกไขและเพมเตมตวอยางการใชงานฟงกชนตางๆ ไดท github
Page 2 of 187
แนะนาตวกนกอน
ปรชญาของ LaravelLaravel เปน php framework ทเนนไปทความเรยบงายของการใชงานตวแปรตางๆ .เราเชอวาในการพฒนาเวบของคณตองเตมไปดวยความสนกสนานแนนอน,ประสบการณความคดสรางสรรคทจะตอบสนองความตองการอยางแทจรง.Laravel พยายามลดงานในระหวางการพฒนาโดยสรางระบบสาเรจรปมาใหอยาง authentication, routing, sessions,และ caching.
Laravel ทจะเปนหนงใน เครองมอในการพฒนาทนกพฒนาชนชอบและสามารถใชงานไดโดยทไมตองเสยสละฟงกชนไหนไปเลย เราเชอวา นกพฒนาทมความสขจะสรางโคดทเยยมยอดเราพยายามนาสงทดของภาษาอนๆ เชน Ruby on Rails, ASP.NET MVC, และ Sinatra เขามาผสมผสานเขากบlaravel
Laravel เตรยมเครองมอทใชเพอการสรางเวบแอพลเคชน ทยดหยนดวย inversion of control container,ระบบmigration , และการทา unit testing ทแสนงายดาย
เรยนร Laravelหนงในทางเลอกทดคอการศกษาคมอการใชงาน หรอซอหนงสอในนครบ
Code Bright by Dayle ReesLaravel Testing Decoded by Jeffrey WayLaravel From Aprentice to Artisan by Taylor Otwell
นกพฒนาหลก
Laravel ถกสรางโดย Taylor Otwell, และ Dayle Rees, Shawn McCool, Jeffrey Way, Jason Lewis, Ben Corlett,Franz Liedke, Dries Vints, Mior Muhammed Zaki, และ Phil Sturgeon.
Page 3 of 187
ผสนบสนน Laravel
UserScapeCartalystElli Davis - Toronto RealtorJay Banks - Vancouver Lofts & CondosJulie Kinnear - Toronto MLSJamie Sarner - Toronto Real Estate
Page 4 of 187
Installationการตดตง laravel
Install ComposerLaravel ใช Composer ในการจดการไลบราลตางๆ รวมจนถงคลาสหลกของระบบ เรมแรกเราตองไปโหลด
composer.phar. เราจะไดไฟลทมนามสกลเปน phar มาแลวเอาไปวางไวท usr/local/bin เพอใหระบบมองเหน
บนวนโดเราม Windows installer อยากรเพมเตมเขาไปดไดบลอกของผมไดครบ
การตดตง Laravel
ใช Composer ในการตดตง
พมพคาสงขางลางไปท commandline composer จะทาการดาวนโหลดมาลงตรงทเราเรยกใช
composer create-project laravel/laravel
ดาวนโหลดเอง
เมอตดตง laravel เวอรชนลาสด แลวกแตกไฟลไปลงทโฟลเดอรของ server เปด command lineเลอกทอยใหตรงกบทเอา laravel ไปวางแลวรนคาสง php composer.phar install (หรอ composer install) กเสรจสน
ถาเราตองการอพเดทกใชคาสง php composer.phar update
ความตองการของระบบ
PHP >= 5.3.7MCrypt PHP Extension
Page 5 of 187
การตงคา
laravel ไมไดตองการปรบแตงอะไรมากเพยงแคเราเขาไปท app/config/app.php โดยอาจปรบแค timezone กบ locale
Note: และมคา key ทอยใน app/config/app.php. เราตองใชคาสง php artisan key:generateเพอสรางคยทจะใชสราง
private key ในการสรางรหสผาน hash ในระบบ
สทธ
laravel ตองการสทธในการอานเขยนโฟลเดอร app/storage
เสนทาง
การกาหนดเสนทางสามารถทาไดท bootstrap/paths.php
URLs ทสวยงามlaravel เตรยมไฟล public/.htaccess ทอนญาตใหเราเรยกใชงานโดยไมตองใส index.php. โดยตองการใชงานขอ
mod_rewrite บน server กอน
Page 6 of 187
Laravel Lifecycle
ตอนท 1 Autoloading
มาดวฏจกรการทางานของ Laravel กนครบ มอยดวยกน 4 ชวง Autoloading,Bootstrap,Application,Run เรมทAutoloadingกอนครบ
1. เรมจากไฟล index.php ครบ ชวงทเราตงคา vhostเราจะตงใหเสนทางทเขาถงเรมแรก คอ /public/ พอเรมเขาถงไฟลindex.php ทาการเรยกไฟล autoload.php จากโฟลเดอร bootstrap
2. ในไฟล autoload.php จะทาการตงคาเวลาทตวเวบเรมทางาน
3. จากนนเราจะ เรยกไฟล autoload.php จากโฟลเดอร vendor ขนมา
4. ทเหนชอยาวขนาดนเปนเพราะถกสมมาจากการทใชคาสงartisan dump autoloadเพอสราง รายชอของ packageใหมนะครบ แตกอนหนานนเราจะทาการโหลดไฟล package ทงหมดกอนโดยเรยกไฟล autoload_real.php ขนมา
Page 7 of 187
5. ตอมาใน ไฟล vendor/composer/autoload_real.php จะทาการเรยกไฟล Classloader มาทาการสรางเปนวตถชอ $loaderแลวก
6. เรยกไฟล autoload_classmap กบ autoload_namespaceขนมาซงในไฟล autoload_classmap จะเปนรายชอของไฟล packageทงหมดทอยในโฟลเดอร vendor สวนในไฟล autoload_namespace จะเปนรายชอของตว namespace ทใชเรยก root pathของไฟล package นนครบ
Page 8 of 187
7. พอเรยกเสรจกจะสงกลบมาท ไฟล autoload แลวกสงคาตอไปให ClassLoader ของ laravel
8. ตามลงมาดวา Classloaderของ laravel มนทายงไงตอนะครบฟงกชน registerทาการเรยกใช ฟงกชน load
Page 9 of 187
9. ฟงกชน loadจะทาการเรยกโฟลเดอร package ทมตามรายชอในตวแปร classทสงมาตอนแรก
10. เทานกเสรจการโหลด package ในโฟลเดอร vendor ครบ อะแตยงไมหมดนะครบ ยงเหลอ package ทโฟลเดอรworkbench เรยกใชคลาส Starterเพอทาการลงทะเบยน package ในโฟลเดอร workbench
โฟลเดอร workbech คอสวนทเราใชในการพฒนา package ในเครองเราซงยงไมเสรจหรอวาทาขนใชเองเรากจะมาเรมตนจากตรงน
package ถอวาเปนสวนสาคญทจะตองรกอนใน laravel 4 นเลย การเขยน package เปนจะทาใหเราเลอก php libralyตวไหนกไดบน packagist.org ซงเปนศนยรวมของ libraly ของ php ทใชมาตรฐาน psr-0,psr-1,psr-2 มาสรางเปนPage 10 of 187
pakage ใชเอง ซงผมกไดศกษาแลวลองทาไปเเลวหลายตวครบ ไวจบเรองน เเลวจะมาขยนเรองการสราง packageตอครบ
ปล.ตวแปร Laravel_Start ตอนแรกเราสามารถนาไปใช ลบกบคาเวลาปจจบนเพอหาเวลาทเวบใช จดการคารองขอ
ตอนท 2 Application
1. ขนตอนนจะเปนการเรมสรางตวออปเจคหลกของ เวบกนแลวนะครบเรมจากไฟล bootstrap/start.php เราจะดาดงลงไปดในคลาส Application
ตรงคลาสนเปนตวหลกทคอยขบเคลอนเวบไซตของเราเลยครบ เพราะ มการเรยกใช คลาสเขามาจานวนมากฟงกชนในน ผมจะไมพยายามไปดใหตาลาย ใหรวาเรา มฟงกชนทเราตองเขาใจ คอ App::share,App::bind,App::instance,App::make เราไปดตอวาเรมมาตว class Applicationทาอะไรตอ
2. เนองจาก ทาการเรยกตวคลาสเขามาแลว จงทาการสรางวตถใหมไดทนทเลยครบสงทตองสรางกอนสามอนดบแรกเลยกคอ Class Exception ใชในการจดการขอผดพลาดClass Routing จดการๆวงของคารองขอClass Event จดการเหตการณตาง ทเกดขน
Page 11 of 187
3. กลบมาท ไฟล start.php ครบ ขนตอมา เราจะทาการตรวจสถานะการทางานของระบบนะครบวาอยในโหมดไหน ตรงนมประโยชนมากในกรณเมอเรากาลงพฒนาอยกตงใหเปน developmentสวนจะไปกาหนดทไหนคอยมาพดกนอกทครบ
4. ทาการโหลดไฟล path.php ซงจะเปน classใชในการกาหนดเสนทางการเขาหาโฟลเดอรตางๆ
5. ทาการเรยกใชงานตว laravel ละครบตรงนจะเปนการ เรยกไฟล start ของตว laravel ขนมา
Page 12 of 187
ตอนท 3 Bootstrap
1. laravel เรมการตรวจวามการตตตง Mcrypt ไหม
2. ตอมากตรวจสภาวะการตงคากอนวาเรากาลง ตงใหอยในสถานะการทอบสอบไหม
3. คลาส Facade จะทาการเคลยร ตวแทนของมนแลวกสรางขนใหม
Page 13 of 187
4. ทาการโหลดขอมลการตงคาจากตวแปร $env ขนมาใสใหคลาส Config ครบ แลวสรางตวแทนใหคลาส Config
5. ทาการตงคาวนเวลาโดยโหลดคามาจากตวแปรในไฟล app.php
6. โหลดคาชอยอจากทไฟล app.php มา
มาใหฟงกชน getInstance มาทาการลงทะเบยนไว
7. ทาการอนญาตใหใชคารองขอชนด put ใชทาการแกไขขอมล กบ delete ใชในการลบขอมล เพอใชตอนทา restfulในกรณท firewall ไมอนญาตใหเมทอดสองอนนผาน เราจงจาเปนตองทาการเปลยนสวนหวของเมทอด postใหกลายเปนสองเมทอดทโดนบลอก
Page 14 of 187
8. ทาการวมคลาสทกตวทโหลดมาเขาดวยกน $config['providers'] คอรายชอคลาสทอยในไฟล app.php
9. เรยกใชฟงกชน $app->boot() เพอเรมตนการทางาน เเลวเรยกไฟล global.phpซงเปนไฟลทเราสามารถใชกาหนดคาเรมตนเองได
10. รองสดทายดงไฟลทเราใชกาหนดสภาวะการตงคาขนมา
11. สดทายในบทนแลวครบเรยกไฟล routes.php จบตอนครบ
ตอนท 4 Run
ตอนสดทายแลวครบ เราใกลไดคาตอบกลบหรอ Response
1. ทาการเขยน session2. คนหา Route ทสงมาวาตรงกบตวทกาหนดไวไหม3. สงให filter เชน before,after ทางาน Page 15 of 187
4. สรางคาตอบกลบหรอ Response5. สงคาตอบกลบ6. เรยกใช after filter อยางเชน log
จบแลวครบกวาจะไดคาตอบกลบหนงครงยาวนานไหมครบ
ทมา :: Kenny Mayer Per Your Request
Page 16 of 187
การเรมตนอยางรวดเรว
หมายเหต :: url ทเราจะเรยกใชงานในตอนเรมแรกคอ localhost หรอ 127.0.0.1ตามดวยชอโฟลเดอรของเวบทเราสราง แลวตามดวย public นะครบ ยกตวอยาง 127.0.0.1/taqmaninw/publicนะครบ
บททนจะทาใหเราเหนภาพรวมของ laravel นะครบ
การตดตง
ถาไมรจก composer แนะนาไปอาน ทน กอน เรมจากใชคาสง
composer create-project laravel/laravel ���������� --prefer-dist
หลงจากนน composer จะทาการดาวนโหลดไฟลตางๆ มาเกบทโฟลเดอรทเรากาหนดชอไว
หลงจากนนกทาความรจกกบ โครงสรางโฟลเดอรของ laravel เรมแรกเราตองไปกาหนดคาตางๆ ทโฟลเดอร app/configกอนในนกจะมการตงคาใหมากมายแตเราอาจตองการแค การกาหนดคาเบองตน
Routingเราตองกาหนด url ทเราจะอนญาตใหเขาถง ฟงกชนตางกอนท app/routes.php ตวอยางการสราง Route เบองตน
Route::get('users', function(){ return 'Users!';});
ตอนนเมอเราพมพชอโปรเจคของเราบนบราวเซอรแลวตามดวย /users เราจะเหนคาวา Users! แสดงอย
การสราง Route ไปหา Controller Page 17 of 187
Route::get('users', 'UserController@getIndex');
ตอนน /user จะถกสงไปทฟงกชน getIndex ของ UserController
การสราง 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
เพอความไมงงวาตวแปรเหลานคออะไร ตามไปดทนเลยครบ Blade documentation
ถาเราจะแสดงไฟล view ทเราสรางกตองอาศย Route ดงตวอยาง
Route::get('users', function(){ return View::make('users');});
ตอไปเราจะไปลยดาตาเบสกนนะครบ Page 18 of 187
การทา Migrationเราจะใชคลาส Migration ในการจดการฐานขอมลนะครบเรมตนดวยการตงคาในการเชอมตอฐานขอมลกอนทไฟล app/database ในคาเรมตนเเลวอาเรย driverจะเปน mysqlแลวเรากเปลยนคาตรง mysql เปนขอมลในการเชอมตอฐานขอมลของเรา
ตอมาในการสราง 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 migratePage 19 of 187
ถาอยากยอนคาสง migrate เราตองใชคาสง migrate:rollback
Eloquent ORMEloquent คอ ชดคาสงทเราใชในการทา sql query นนเองครบ ชวยใหเราสะดวกสะบาย ทางานไดรวดเรวขนเรมแรกเราตองไปสราง model ทโฟลเดอร app/models โดยตงชอวา User.php ตวอยางการประกาศคลาสในโมเดล
class User extends Eloquent {}
ตวอยางการเรยกใช 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 และ UnitTesting.ถาตองการใชงานในระดบสงตอกไปท IoC Container. Happy In Laravel krub :) Page 20 of 187
Page 21 of 187
Artisan CLI
IntroductionArtisan คอ ชดคาสงทใชเรยกงานผานทาง 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
การสรางคาสงขนใชงานเองPage 22 of 187
เราสามารถสรางคาสง 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.Page 23 of 187
เมอเรากาหนดใหมการใสคาสงเพมเตม ลกษณะอาเรยจะเปนแบบน
array($name, $shortcut, $mode, $description, $defaultValue)
ในการกาหนด mode ใหเปนไดหลายๆแบบไดเชน
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();
สงผลการทางานPage 24 of 187
มประเภทของคาสงทจะแสดงออกทาง 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);
Page 25 of 187
การลงทะเบยนคาสง
เมอการสรางคาสงเสรจสน เราตองนาไปลงทะเบยนทไฟล 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'));
Page 26 of 187
Cache
การตงคา
Laravel เตรยมรปแบบของการ cache ไวใหเราใชเเลวหลายตวเลยนะครบ . ซงรายชอและการตงคาอยทapp/config/cache.php. ในไฟลเราสามารถตงคาใหกบ cache ทเราชนชอบไดเลย Laravel สนบสนนทง Memcached กบRedis อยแลวครบ.
กอนจะทาการตงคาใดๆ ลองไปศกษากอนนะครบ ตว laravel ใช file cache เปนตวเรมตนนะครบถาเวบไซตมขนาดใหญควรเปลยนไปใช Memcached หรอ APC จะดกวา
การใชงาน Cache
การเกบคาลง cache
Cache::put('key', 'value', $minutes);
เกบลงในกรณทไมมคานนอย
Cache::add('key', 'value', $minutes);
ตรวจวามคาไหม
if (Cache::has('key')){ //}
ดงคาจากแคช
$value = Cache::get('key'); Page 27 of 187
ดงคาโดยเรยกคาเรมตน
$value = Cache::get('key', 'default');
$value = Cache::get('key', function() { return 'default'; });
กาหนดใหคาชนดนไมมวนหมดอาย
Cache::forever('key', 'value');
บางเวลาเราตองการเรยกใชคาจากแคช แตไมมคาแลว เราสามารถเรยกใช Cache::rememberโดยการดงคาจากฐานขอมลขนมาเกบไวในแคช
$value = Cache::remember('users', $minutes, function(){ return DB::table('users')->get();});
และยงสามารถผสมคาสง remember กบ forever
$value = Cache::rememberForever('users', function(){ return DB::table('users')->get();});
เราสามารถเกบคาชนดใดกไดเพราะรปแบบการเกบคาใชแบบ serialize
การลบคาออกจากคย
Cache::forget('key');
การเพมและการลดคา
แคชทกชนดยกเวน file กบ database สนบสนนการทาเพมและลดคาของแคชPage 28 of 187
การเพมคา
Cache::increment('key');
Cache::increment('key', $amount);
การลดคา
Cache::decrement('key');
Cache::decrement('key', $amount);
Cache Sections
หมายเหต: Cache sections ไมสนบสนนแคชแบบ file หรอ database
Cache sections คอการใหเราสามารถจบกลมใหกบแคชทมรปแบบการเกบคาทคลายๆ กนโดยใชคาสงsection
ตวอยางการใชงาน Cache section
Cache::section('people')->put('John', $john);
Cache::section('people')->put('Anne', $anne);
การเขาถงคาของแคช
$anne = Cache::section('people')->get('Anne');
flush คอการลบคาออก:
Cache::section('people')->flush();
การเกบแคชไวในฐานขอมลPage 29 of 187
เมอเราจะใชฐานขอมลเกบคาแคช เราตองเพมตารางทจะใชเกบกอนนคอตวอยางการสรางตารางทใชเกบแคชในรปแบบ ของ laravel
Schema::create('cache', function($table){ $table->string('key')->unique(); $table->text('value'); $table->integer('expiration');});
Page 30 of 187
เราสามารถสรางคาสง 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. Page 31 of 187
เมอเรากาหนดใหมการใสคาสงเพมเตมลกษณะอาเรยจะเปนแบบน
array($name, $shortcut, $mode, $description, $defaultValue)
ในการกาหนด mode ใหเปนไดหลายๆแบบไดเชน: 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();
สงผลการทางานPage 32 of 187
มประเภทของคาสงทจะแสดงออกทาง 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?');
Asking The User For Confirmation
if ($this->confirm('Do you wish to continue? [yes|no]')){ //}
เราสามารถกาหนดคาเรมตนใหคาสง confirm ใหเปนtrue หรอ false ได
$this->confirm($question, true);
Page 33 of 187
การลงทะเบยนคาสง
เมอการสรางคาสงเสรจสน เราตองนาไปลงทะเบยนทไฟล 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'));
Page 34 of 187
การดงคาของการตงคาหลกมาใช
สวนการตงคาหลกๆ ของเวบเราจะอยทโฟลเดอร 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 กทาแบบตวอยางเลยครบ Page 35 of 187
<?php
return array(
'driver' => 'file',
);
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();
Page 36 of 187
การปรบปรงเวบไซต
เมอเราตองการปดเวบเพอทาการปรบปรง เราจะกาหนดเมทอด App::down ไวท app/start/global.phpซงจะทาใหทกคารองถกพาไปทหนา ทบอกวาตอนน เวบกาลงอยในสถานะปรบปรง.
ตองการทาใหรวดเรวขนกใช command line กได
php artisan down
up เปนคาสงใหเวบกลบไปอยในสถานะออนไลนอกครง
php artisan up
ถาตองการเปลยนหนาทใชในการแสดงผลกเขาไปตงคาท app/start/global.php ตวอยาง
App::down(function(){ return Response::view('maintenance', array(), 503);});
Page 37 of 187
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');Page 38 of 187
เราสามารถตงชอยอใหเพอสะดวกตอการใชงาน ตามตวอยางขางลางเลยครบ
Route::get('foo', array('uses' => 'FooController@method','as' => 'name'));
จะสรางลงไปท 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 {
/** * �
������� _construct ���
�������������
����������
�����
������
��
*/ public function __construct() { $this->beforeFilter('auth');
$this->beforeFilter('csrf', array('on' => 'post'));
$this->afterFilter('log', array('only' => array('fooAction', 'barAction'))); }
}Page 39 of 187
เราสามารถจบกลมใหตวกรองได เหมอนในตวอยางนะครบ
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() { // �
������������������
������
���������� get ��
������
}
public function postProfile() Page 40 of 187
{ // �
������������������
������
���������� post ��
������
}
}
ในกรณทชอฟงชนเรามหลายคาใชเครองหมาย - เพอเรยกไดดงตวอยางเราเรยกใชฟงกชน 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 Page 41 of 187
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
ถาเราไมตองการสรางทงหมดตามในตารางกกาหนดเปนรายตวไปเลยครบ ดงตวอยาง
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){ //}
Page 42 of 187
การจดการฐานขอมลเบองตน
การตงคา
เราจะไปตงคาท app/config/database.php. ซงเราจะไปตงคาการเชอมตอขางในนครบ
laravel ในขณะนสนบสนน: MySQL, Postgres, SQLite, and SQL Server.
การทา Queriesเราใชคลาส DB ในการเรยกใชการควรนะครบ
ตวอยางการควร
$results = DB::select('select * from users where id = ?', array(1));
ฟงกชนselectจะสงคาเปน arrayกลบมาเสมอ
ตวอยางการเพมขอมล
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 จะคนคาเปนจานวนของแถวทไดทาการจดการไป.Page 43 of 187
ตวอยางการใชคาสงทวไป
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();});
การเขาถงการเชอมตอฐานขอมล
สมมตเวบของเราใชฐานขอมลหลายชนด สามารถใชฟงกชน DB::connection ในการเรยกฐานขอมลเฉพาะทเราตองการดงตวอยาง
$users = DB::connection('foo')->select(...);
แลวกสามารถเชอมตอใหมดวยคาสง reconnect
DB::reconnect('foo');Page 44 of 187
การเกบประวตการควร
โดยคาเรมตน laravel จะเกบประวตไวในหนวยความจาอยเเลว ในกรณทเวบของเรามคารองขอจานวนมากการเกบประวตจะใชหนวยความจามาก เราจะใชฟงกชน disableQueryLog เพอทาการหยดเกบประวต ตวอยาง
DB::connection()->disableQueryLog();
Page 45 of 187
Eloquent ORM
ทาความรจกกอน
Eloquent ORM คอการทเราจาลองตารางเปนคลาสแลว เรยกใชงานเปนชอของตารางนนเลยทาใหเขาใจการพฒนารวดเรวขน เขาใจงายขน ทเรยกวา Eloquent เพราะตวมนมความเรยบงาย
การใชงานเบองตน
เรมตนดวยการสราง 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
Page 46 of 187
การควรโดยใช eoloquent
คนหาขอมลทงหมดจากตาราง user
$users = User::all(); //
คนหาตามเงอนไข
คนหาโดยคา id เทากบ 1
$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);
Page 47 of 187
});
ตวอยางการควรแบบหลายเงอนไข
$users = User::where('votes', '>', 100)->take(10)->get();
foreach ($users as $user){ var_dump($user->name);}
Eloquent Aggregates
$count = User::where('votes', '>', 100)->count();
ถาเราอยากเขยนคาสงควร ขนมาใชเองกตองใชฟงกชน 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');
} Page 48 of 187
ตวอยางการตงคาตวแปร guard
class User extends Eloquent {
protected $guarded = array('id', 'password');
}
ตวอยางคอลมน id and password เราจะไมอนญาตใหทาการใสคาทมาในรปแบบอาเรยลงไป
การปองกนไมใหทาการเพมขอมลเปนอาเรย
protected $guarded = array('*');
เพม, ลบ, แกไขตวอยางการแกไขขอมลแบบไมใช namespace
$user = new User;
$user->name = 'John';
$user->save();
หมายเหต: โดยเรมตน laravel จะทาการเพมคาคยหลกใหอตโนมต ถาเราไมตองการกตงคาตวแปร incrementingในmodel ใหเปน false.
เราสามารถใชคาสง create เพอสรางขอมลใหมได แตกอนหนานนตองกาหนดตวแปร fillable หรอ guardedไมงนเพมไมไดตด error
การสรางขอมลใหม
$user = User::create(array('name' => 'John'));
Page 49 of 187
ตวอยางการแกไขขอมล
$user = User::find(1);
$user->email = '[email protected]';
$user->save();
บางเวลาเราตองบนทกคาในตารางทอางองกน เราจะใชคาสง push
บนทกคาพรอมกบบนทกลงตารางทมการเชอมกนอย
$user->push();
ตวอยางการลบขอมล
$user = User::find(1);
$user->delete();
ลบโดยกาหนด id เปนเงอนไข
User::destroy(1);
User::destroy(1, 2, 3);
ตวอยางการลบแบบมเงอนไข:
$affectedRows = User::where('votes', '>', 100)->delete();
ถาเราตองการแกไขเฉพาะคอลมนทใชบนทกเวลา เราจะใชคาสง touch
ตวอยางการใชงาน
$user->touch();Page 50 of 187
การกาหนดวาขอมลนถกลบเเลว
เราสรางตวแปร $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();
Page 51 of 187
ฟงกชน restore สามารถใชกบความสมพนธไดดวย
$user->posts()->restore();
ถาตองการลบขอมลจรงๆ กใชคาสง forceDelete
$user->forceDelete();
คาสง 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ใชในการกาหนดรปแบบวนเวลาทเราจะเกบ
ตวอยางการใชงาน Page 52 of 187
ตวอยางการใชงาน
class User extends Eloquent {
public function freshTimestamp() { return time(); }
}
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 ตอ กลม
Page 53 of 187
กลม ตอ กลมความสมพนธแบบซบซอน
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 Page 54 of 187
ตวอยางการเชอมกลบไปยง User Model
class Phone extends Eloquent {
public function user() { return $this->belongsTo('User'); }
}
เหมอนกบขางบนครบ เราไมเอา 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'); }
}
ตวอยางการคนหาตารางทเชอมกนอย Page 55 of 187
$comments = Post::find(1)->comments;
ตวอยางการคนหาแบบหลายเงอนไขครบ ดงตวอยาง เราจะคนหาความคดเหนทม title ชอ foo โดยเอาคาเเรกทเจอกอน
$comments = Post::find(1)->comments()->where('title', '=', 'foo')->first();
อกครง อยาลมเชอมกลบไปยงตารางทเชอมมานะครบ
ตวอยางอกครง
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'); }
}Page 56 of 187
ตอนนเราสามารถตรวจไดเเลววาผใชงานหมายเลข 1 มสทธทาอะไรไดบาง
$roles = User::find(1)->roles;
ถาเราตองการใชชอตาราง ตามใจเรากสามารถทาไดโดยการ สงพารามเตอรไป ดงตวอยางครบ
return $this->belongsToMany('Role', 'userroles');
หรอจะเปลยนไปจนถงชอคอลมนเลยกได แตตองสงชอ คอลมนทเราตงเองไปบอก model ดวย
return $this->belongsToMany('Role', 'userroles', 'user_id', 'foo_id');
อยาลมเชอมความสมพนธกลบมาดวยนะครบ
class Role extends Eloquent {
public function users() { return $this->belongsToMany('User'); }
}
ความสมพนธทยงยากมากขน
เพอชวยใหเขาใจไดงายขนจะมตวอยางมาใหดกนครบตวอยางโครงสรางตาราง
staff id - integer name - string
orders id - integer price - integer
photos Page 57 of 187
id - integer path - string imageable_id - integer imageable_type - string
มนพเศษตรงทคอลมน imageable_id กบ imageable_type ของตาราง photos ทเราจะใชเกบคยทใชเชอมตาราง photoเขากบตาราง staff หรอ order ใชเกบคยเชอมรวมกนได โดยใชคอลมนเมอเรากาหนดคยเชอมและชอของตารางทเชอมไป ORM จะทาการตรวจสอบโดยใชคอลมนท imageable_typeในการหาวาคยนเปนของตารางไหน โดยเราตองตงชอฟงกชนวา imageable เราตองประกาศ model แบบนครบ
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'); }
}
ตอนนเราสามารถใช id ของ staff หรอ order มาคนหารปภาพได Page 58 of 187
ตวอยาง
$staff = Staff::find(1);
foreach ($staff->photos as $photo){ //}
ความพเศษจรง ๆอยทเมอเราใช Photo model ในการคนครบ
ตวอยาง
$photo = Photo::find(1);
$imageable = $photo->imageable;
ความสมพนธทชอ imageable บน model Photo จะสงขอมลของทง Staff และ Order หรอตารางใดตารางหนงขนอยกบคาทเราใชคนหาจะไปตรงกบ model ไหน
การควรโดยใชความสมพนธเปนเงอนไข
เราสามารถจากดผลการคนหาดวยฟงกชน has
คนหาโดยจากดเฉพาะความสมพนธ
$posts = Post::has('comments')->get(); // ������������������� post ������������
���� comment
You may also specify an operator and a count:
$posts = Post::has('comments', '>=', 3)->get(); // ����� post �
���� comment �����
������������� 3
การคนหาแบบยดหยน
Eloquent ทาใหเราสามารถคนหาแบบตอเนองโดย Page 59 of 187
พยายามใหเราจากดขอบเขตการคนหาใหไดลกลงทสดเพอใหไดเฉพาะขอมลทตองการจรงๆ
และพลกแพลงรปแบบของฟงกชนไดมากมาย ดงตวอยาง
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'); }
} Page 60 of 187
แลวการควรทมปญหากประมาณน
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, ...)Page 61 of 187
จะทาใหเวบของเราโหลดเรวขนอยางมากเลยครบ
ตวอยาง การใช eager loading ในกรณตารางมการเชอมกบอกหลายตาราง
$books = Book::with('author', 'publisher')->get();
จะใชการทา eager load กบคอลมนอนได
$books = Book::with('author.contacts')->get();
In the example above, the author relationship will be eager loaded, and the author's contacts relation will alsobe 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 Page 62 of 187
ของบทความทเราโพสความคดเหนใสไปมาใสในความคดเหนดวย
ตวอยางการเกบขอมลทตองมความสมพนธ
$comment = new Comment(array('message' => 'A new comment.'));
$post = Post::find(1);
$comment = $post->comments()->save($comment);
ในตวอยางคอลมนpost_id จะถกใสคาใหอตโนมต
Associating Models (Belongs To)
เมอเราจะทาการแกไขขอมลทมความสมพนธแบบ กลมตอหนง เราตองใชฟงกชน associateในการเพมคาคยเชอมไปยงตารางทมความสมพนธอยดวย
$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)); Page 63 of 187
เมอเพมแลวกลบได ฟงกชน 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);
ในตวอยางเราสราง 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() Page 64 of 187
{ 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');
ตอนนตวแปร foo กบ bar จะถกใชกบฟงกชน pivot ในการจดการตาราง Role
และถาเราตองการ คอลมน created_at กบ updated_at เพอใชกาหนดเวลา laravel มฟงกชน withTimestampsซงเราตองกาหนดตอนประกาศความสมพนธครบ
return $this->belongsToMany('Role')->withTimestamps();
ตอมาถาเราตองการลบขอมลในตารางในตารางกลาง เพอความถกตองของขอมลเราจะใชฟงกชน detachนะครบPage 65 of 187
ตวอยางการใชงาน
User::find(1)->roles()->detach();
เราจะทาการแกไขไมใหผใชงานหมายเลข 1 มสทธในการทาอะไรเลย
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 มาให การใชงาน each และ filter
$roles = $user->roles->each(function($role) {
});
$roles = $user->roles->filter(function($role)Page 66 of 187
$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); }
}
Accessors & Mutatorsถายงไมเขาใจวาสองฟงกชนนมนคออะไร ทาอะไรไดบาง แนะนาเขาไปอานทผมสรปไวกอนใน บลอก ครบบางเวลาเราตองการ จดรปแบบขอมลใหอยในรปแบบทเราตองการ กอนจะบนทกหรอดงมาใช eloquent เตรยมฟงกชนPage 67 of 187
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); }
}
Date Mutatorsโดยคาเรมตนเเลว Eloquent จะทาการตงคาใหคอลมน created_at, updated_at, และ deleted_at ตามคาเบองตนของphp.ini อยเเลวนะครบ
แตถาเราตองการแกไขหรอเรยกใชงานแบบไมอยากเขาไปยงตรงๆ กสามารถใชฟงกชน getDates Page 68 of 187
แบบในตวอยางเลยครบ
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... }
} Page 69 of 187
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(); Page 70 of 187
การใชงาน Eloquent จากใน route เลย
Route::get('users', function(){ return User::all();});
บางเวลาาเราไมอยากใหบางคอลมนถกเรยกไปพรอมกบ toJson หรอ toArray เรากใชตวแปร hidden ในการนน
ตวอยางการใชงาน
class User extends Eloquent {
protected $hidden = array('password');
}
Page 71 of 187
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::fatalPage 72 of 187
App::fatal(function($exception){ //});
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.'); Page 73 of 187
Log::error('Something is really going wrong.');
ประเภทของ log ถกประกาศไวในมาตรฐาน RFC 5424 ม debug, info, notice, warning, error, critical, และ alert.
ตวอยางการสงคาทเปนอาเรยใหฟงกชน info ทอยในคลาส log
Log::info('Log message', array('context' => 'Other helpful information'));
การดงคามาใชกใชฟงกชนตามตวอยางเลยครบ
$monolog = Log::getMonolog();
เราสามารถกาหนดเหตการณทเราจะใหเกบ log ไดโดยใชฟงกชน listen:
ตวอยาง
Log::listen(function($level, $message, $context){ //});
Page 74 of 187
Events
การใชงานเบองตน
คลาส Event เตรยมมาใหเราใชในการดกจบเหตการณตางๆทเกดขนบน เวบของเรา หมายเหต Eventคอเหตการใดทเกดขนบนเวบเรา ยกตวอยางการเพมลบแกไข , Listener คอ ฟงกชนทคอยดกจบเหตการ , fireคอฟงกชนทสงใหเกดเหตการขนเพอให listerner ทางาน
การดกรอฟงเหตการณ
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 เพอหยดฟงกชนนได
หยดการทางานของเหตการPage 75 of 187
Event::listen('user.login', function($event){ // Handle the event...
return false;});
Wildcard Listenersคอการดกฟงทกเหตการเลย ไมเฉพาะเจาะจงเเลว
การใชงาน
Event::listen('foo.*', function($param, $event){ // Handle the event...});
ทนถามเหตการณอะไรทขนตนดวย foo..ฟงกชนในตวอยางกจะทางาน
ใช Classes กบ Listenersในบางกรณ เราสามารถผกคลาสเขากบเหตการได โดย laravel จะใชการทา Laravel IoC container,ในการจดการ
ตวอยาง
Event::listen('user.login', 'LoginHandler');
โดยคาเรมตนฟงกชน handle ในคลาส LoginHandlerจะถกเรยกกอนเลย เหมอนกบ _construct
ฟงกชน handle จะถกเรยกใชเลย
class LoginHandler {
public function handle($data) { Page 76 of 187
// }
}
ถาเราไมตองการ กผกเมทอดทเราตองการเขาไปดงนครบ
Event::listen('user.login', 'LoginHandler@onLogin');
การเรยงลาดบเหตการ
ใชฟงกชน queue กบ flush ในการเรยงลาดบการเกดเหตการ
การสรางลาดบ
Event::queue('foo', array($user));
Event Subscribersคอคลาสทเราแบงกลมฟงกชนทใชจดการเหตการ โดยตนทางมาจากฟงกชน subscribe
ตวอยางการสรางคลาส Subscriber
class UserEventHandler {
/** * �
����������
������������
��������
*/ public function onUserLogin($event) { // }
/** * �
������������������
*/ public function onUserLogout($event) Page 77 of 187
{ // }
/** * ��
��������������������������
* * @param Illuminate\Events\Dispatcher $events * @return array */ public function subscribe($events) { $events->listen('user.login', 'UserEventHandler@onUserLogin');
$events->listen('user.logout', 'UserEventHandler@onUserLogout'); }
}
เมอประกาศคลาสแลว การนาไปใชงานเรากตองเอาไปลงทะเบยนกบคลาสหลก
ตวอยาง
$subscriber = new UserEventHandler;
Event::subscribe($subscriber);
Page 78 of 187
Facadesความเหนสวนตว บทนจะตองใชจนตนาการเยอะหนอยนะครบ เพราะเปนเรองของแนวคดทใชสรางจดขายของตวlaravel เลยครบ ในการตด $this-> ทงไปทาใหโคดอานงาย ทาความเขาใจงาย ลดบรมาณการเขยนลงใครทอยากจะเอาคลาสบน packagist มาทาเปน package ใชเองตองอานครบ
รจกดานหนาของตกกนกอน
ถายงไมรจกวามนคออะไรลองไปอานทผมสรปไวกไดครบ
Facades แปลเปนไทยคอ ดานหนาของตก ทมาของมนคอการใช facade design pattern เขามาจดการทาใหคลาสทเราเรยกใชงานกลายเปนแบบ static แทนทจะสรางเปนออปเจคเหมอนทผานมา การทาแบบ staticคอการเรยกใชคลาสนนตรงๆ เลยครบ การทาแบบนจะทาใหรปแบบของฟงกชนดเขาใจไดงายมาก บางครงเราไปเจอคลาสทเจงๆ และอยากเอาเขามาใชใน laravel เรากอยากใหมนเรยกแบบ staticไดเพราะฉะนนเราจงตองมาดบททนครบ
Note: กอนทจะมาเจาะลกลงไปในโครงสรางหลกของ laravel แนะนาใหไปอานบบทน IoC container กอนครบ
หลกการเบองตน
โดยโครงสรางหลกของ laravel แลว, facade คลาสถกวางใหใชในการเรยกใชงาน วตถทถกลงทะเบยนไวในคลาสContainer ในการสราง facade ขนใชเองนน เราตองการแคเมทอด getFacadeAccessorแคตวเดยวครบ ตวคลาส Facadeหลกจะทาการใช __callStatic() ซงเปน magic-method ของ phpจะไปทาการเรยกออปเจคของคลาสทเราทาการลงทะเบยนไวทคลาส Service Providerของ ไลบราล นนๆ
การประยกตใชงานPage 79 of 187
ในตวอยาง, เรายกตวอยาง คลาส 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 Page 80 of 187
ตวอยางการสราง package แบบงายครบ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 ของPage 81 of 187
คลาส Payment ในรปแบบ static ไดเเลว
Payment::process();
Page 82 of 187
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 Page 83 of 187
ฟงกชน array_except ใชลบคา key หรอ value ออกจากอาเรย
$array = array_except($array, array('keys', 'to', 'remove'));
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 >= 150;});
array_flatten
ฟงกชน array_flatten ทาการแตกอาเรยหลายมตลงมาเหลอมตเดยว
$array = array('name' => 'Joe', 'languages' => array('PHP', 'Ruby'));
$array = array_flatten($array);
// array('Joe', 'PHP', 'Ruby');
array_forget Page 84 of 187
ฟงกชน 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'));
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); Page 85 of 187
$name = array_pull($array, 'name');
array_set
ฟงกชน array_set ใชเพมคาลงอาเรยโดยกาหนดทอยโดยใชเครองหมายดอท
$array = array('names' => array('programmer' => 'Joe'));
array_set($array, 'names.editor', 'Taylor');
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'));Page 86 of 187
Pathsตวแปรทใชเกบคาทอยของโฟลเดอร
app_path
เกบคาทอยของโฟลเดอร application
base_path
เกบคาทอยของเวบระดบ root เลย
public_path
เกบคาทอยของโฟลเดอร public
storage_path
เกบคาทอยของโฟลเดอร application/storage
Stringsคลาสน ใชจดการตวอกษร เชนแปลงเปนตวใหญ รปแบบไวยกรณ
camel_case
แปลงคาใหขนตนดวยตวใหญซงเรยกวา camelCase.
$camel = camel_case('foo_bar');
// fooBar
class_basename
ใชดงชอคลาสจาก namespace path. Page 87 of 187
$class = class_basename('Foo\Bar\Baz');
// Baz
e
เรยกใชฟงกชน htmlentites เพอกรองคา
$entities = e('<html>foo</html>');
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'); Page 88 of 187
str_finish
เพมตวอกษรทกาหนดลงไปทายคา
$string = str_finish('this/string', '/');
// this/string/
str_is
ตรวจวาคาทปอนเขามาตรงกบรปแบบทกาหนดไหม
$value = str_is('foo*', 'foobar');
str_plural
แปลงตวอกษรจากเอกพจนเปนพหพจ ปล.เตม s,es,ies
$plural = str_plural('car');
str_random
สมตวอกษรขนมาโดยกาหนดความยาวตามคาทปอนเขามา
$string = str_random(40);
str_singular
แปลงตวอกษรจากเอกพจนเปนเอกพจน
$singular = str_singular('cars');
studly_case
แปลงคาใหไปอยในรปแบบ StudlyCase คออกษรขนตนคาเปนตวใหญถามเครองหมายอนเดอรสกอรกลบออก Page 89 of 187
$value = studly_case('foo_bar');
// FooBar
trans
ใชแปลภาษาเหมอนกบใช Lang::get.
$value = trans('validation.required'):
trans_choice
แปลโดยเรมตนจากคาทกาหนดโดยนบตอไปตามคาจากตวแปร $count เหมอนกบ Lang::choice.
$value = trans_choice('foo.bar', $count);
URLsเปนฟงกชนทใชจดการ URL
action
สรางลงจาก controller
$url = action('HomeController@getIndex', $params);
asset
สรางลงจากไฟลทอยในโฟลเดอร asset
$url = asset('img/photo.jpg');
link_to
สรางลงโดยกาหนดคาตางๆเอง Page 90 of 187
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());
secure_asset
สรางลงจากไฟลทอยในโฟลเดอร asset โดยใช https
echo secure_asset('foo/bar.zip', $title, $attributes = array());
secure_url
สรางลงทเปน https
echo secure_url('foo/bar', $parameters = array());
urlPage 91 of 187
สรางลงจากการกาหนดเอง
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'; });
with
ใชดงคากลบมาเปนวตถ
$value = with(new Foo)->doWork();
Page 92 of 187
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))
การปองกน CSRF Page 93 of 187
Laravel เตรยมการปองกนโดยสรางคา hash ขนจาก session ของ user แลวสราง hidden form ขนมาใสไว เราเพยงแตใชเมทอด tokenประกาศไวกเสรจเเลวครบ
ตวอยาง
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!
การใสปายชอ Page 94 of 187
การใสปายชอใหฟอรม
echo Form::label('email', 'E-Mail Address');
การใสคลาสใหฟอรม
echo Form::label('email', 'E-Mail Address', array('class' => 'awesome'));
หมายเหต: หลงจากใสคา label ชอฟอรม คา id กจะตงตามคา label โดยอตโนมต.
Text, Text Area, Password & Hidden Fieldsตวอยางฟอรมทใชรบคา
echo Form::text('username');
กาหนดคาเรมตนใหฟอรม
echo Form::text('email', '[email protected]');
หมายเหต: hidden และ textarea ฟงกชนใชงานเหมอน text เมทอด
สรางฟอรมรบรหสผาน
echo Form::password('password');
สรางฟอรมชนดอน
echo Form::email($name, $value = null, $attributes = array());echo Form::file($name, $attributes = array());
Checkboxes and Radio ButtonsPage 95 of 187
สรางฟอรมชนดเลอกคา
echo Form::checkbox('name', 'value');
echo Form::radio('name', 'value');
สรางฟอรมชนดเลอกคาโดยคาเรมตนคอเลอกไวเเลว
echo Form::checkbox('name', 'value', true);
echo Form::radio('name', 'value', true);
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'),));
Page 96 of 187
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();
Page 97 of 187
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 มาใหใชในการนเลยครบPage 98 of 187
ตวอยางการใชงาน
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 เพอทาการตรวจสอบคาตางๆ ในคลาสนนใหเองครบPage 99 of 187
บางกรณคลาสทเราจะใชงานดนไปดงคลาสทเปน interface เขามาใชดวย เพอการนนเราตองใช App::bind เมทอดในการผก ดงตวอยาง
ตวอยางการผก 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() { Page 100 of 187
$all = $this->orders->all();
return View::make('orders', compact('all')); }
}
ในตวอยางคลาส OrderRepository แทรกเขาไปโดยอตโนมตเมอ คลาส OrderController ทางาน เมอมการทา unit testingคลาส OrderRepository กจะถกเพมเขามาเหมอนกน
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; Page 101 of 187
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
ตวอยาง
App::register('FooServiceProvider');
Container Eventsใน IOC กม event อยชอเมทอดวา resolving
การใชงาน resoliving เพอรอดวาม IOC ตวไหนทางานบาง
App::resolving(function($object){ //});
Page 102 of 187
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');Page 103 of 187
การใชงานเบองตน
การดงคาจากไฟลภาษา
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 ในการเลอกPage 104 of 187
echo Lang::choice('messages.apples', 10);
เนองจากการแปลภาษาของ laravel สบทอดมาจากของ Symfony เราจงสามารถสรางเงอนไขทซบซอนดงตวอยางได
'apples' => '{0} There are none|[1,19] There are some|[20,Inf] There are many',
Page 105 of 187
การตงคา
Laravel นาไลบราล SwiftMailer มาใชงาน การตงคาอยท app/config/mail.php,โดยจะใหเราเปลยน SMTP host, port,และ username กบ password, แลวกคา from คอคาเรมตนของชอผรบ. ถาเราตองการใชไลบราร php mailในการสงกเพยงเปลยน driver เปน mail
การใชงานเบองตน
ฟงกชน Mail::send ใชในการสงอเมล
Mail::send('emails.welcome', $data, function($message){ $message->to('[email protected]', 'John Smith')->subject('Welcome!');});
เมทอด send ตวแปรแรกคอไฟล html ทเปนรปแบบขอมความในเมล. ตวทสองคอขอมลทจะเขยนลงเมล $dataซงจะถกสงไปยง view ตวทสามเปนฟงกชนทใชกาหนดคาตางๆของอเมล
Note: ตวแปร $message คอออปเจคของตว Swiftmailer class ซงเราจะใชกาหนดคาตางๆของเมล
Mail::send(array('html.view', 'text.view'), $data, $callback);
ตวอยางคอเราเลอกทจะสงไปในรปแบบใด html หรอ text
Mail::send(array('text' => 'view'), $data, $callback);
ตวอยางการปรบแตงเนอหาภายในเมล:
Mail::send('emails.welcome', $data, function($message){ Page 106 of 187
$message->from('[email protected]', 'Laravel');
$message->to('[email protected]')->cc('[email protected]');
$message->attach($pathToFile);});
เมอจะทาการแนบไฟลเราตองใสนามสกลกบชอใหมนดวย:
$message->attach($pathToFile, array('as' => $display, 'mime' => $mime));
การแทรกไฟลไวระหวางบรรทด
เราสามารถแนบรปไปโดยไมใหเเสดงไดโดยใชฟงกชน embed
ตวอยางการใชงาน
<body> Here is an image:
<img src="<?php echo $message->embed($pathToFile); ?>"></body>
เรยงลาดบการสงอเมล
Laravel เตรยมคลาส Queue มาใหเราใชในการเรยงลาดบการสงอเมล
ตวอยาง
Mail::queue('emails.welcome', $data, function($message){ $message->to('[email protected]', 'John Smith')->subject('Welcome!');});
เราสามารถหนวงเวลาการสงโดยใชฟงกชน later ตามตวอยางครบPage 107 of 187
Mail::later(5, 'emails.welcome', $data, function($message){ $message->to('[email protected]', 'John Smith')->subject('Welcome!');});
ถาเรามหลายคว มฟงกชนใหเราเรยงควอก คอ queueOn และ laterOn
Mail::queueOn('queue-name', 'emails.welcome', $data, function($message){ $message->to('[email protected]', 'John Smith')->subject('Welcome!');});
Mail & Local Developmentในการพฒนานน เรายงไมตองใชงานเมลจรงๆในการสงกได laravel เตรยมฟงกชน Mail::pretend หรอตงคา pretend ในapp/config/mail.php เปน true. เพอเขาส pretend mode ขอความบนเมลทถกสงจะถกเขยนบนลอกแทย
Page 108 of 187
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 create_users_table --table=users --create
Running Migrationsการสงใหคาสง migration ทางาน
php artisan migrate Page 109 of 187
กาหนดทอยของไฟลทจะรน
php artisan migrate --path=app/foo/migrations
สงรนเฉพาะตรง 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 เพอรนคลาสอนๆ ทาใหเราลาดบการทางานได
Page 110 of 187
ตวอยาง
class DatabaseSeeder extends Seeder {
public function run() { $this->call('UserTableSeeder');
$this->command->info('User table seeded!'); }
}
class UserTableSeeder extends Seeder {
public function run() { DB::table('users')->delete();
User::create(array('email' => '[email protected]')); }
}
การทางานกใชคาสง db:seed command บน Artisan CLI:
php artisan db:seed
ทาการยอนกลบการทางานดวย
php artisan migrate:refresh --seed
Page 111 of 187
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 ของเรา ควรมารจกโครงสรางของมนกอนครบ
โครงสรางของ package Page 112 of 187
โครงสรางโฟลเดอรของ package
/src /Vendor /Package PackageServiceProvider.php /config /lang /migrations /views/tests/public
เมอตามเขาไปดในโฟลเดอร src/����������/�
���package������ จะเจอกบไฟล 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');// �
�����������������
��������
���������
������ boot package
ClassLoader::addDirectories(array( app_path().'/widgets' ));
ถาลบบรรทดแรกออกไปผลกคอ package ไมทางานครบ laravel จะไมรจก package นเลย Page 113 of 187
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');
Page 114 of 187
include __DIR__.'/../../routes.php';}
หมายเหต:ถาตองการใช controller ดวยมนใจวามนตองถกเพมไวในไฟล composer.json ในสวน autoload
การตงคา 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');
Cascading Configuration Files
เมอเราดาวนโหลดไฟล package มาดวย composer ตองนาไฟลโฟลเดอร config ของ package ออกมาใชกอนPage 115 of 187
ตวอยางการใชงาน
php artisan config:publish vendor/package
เมอคาสงทางานเสรจจะปรากฎอยท app/config/packages/vendor/package
Package Migrationsเราสามารถทา 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:publishPage 116 of 187
php artisan asset:publish vendor/package
แตถา package ยงอยในโฟลเดอร workbench ตองใชคาสงนครบ
php artisan asset:publish --bench="vendor/package"
ตอนนโฟลเดอรจะถกสงไปไวท โฟลเดอรpublic/packages ตวอยางชอโฟลเดอร userscape/kudos ตวอยางเสนทางทอยpublic/packages/userscape/kudos.
การแบงปน Packages ของเราเมอพฒนาเสรจแลว เราเกดอยากใหคนอนชวยพฒนาตอ หรชวยหาบกให เราตองอพ package ของเราขน github หรอbitbucket กอนครบ หลงจากนนไปสมคร Packagist เพอนา package ของเราไปผกไวกบฐานขอมลหลกของ composerหลงจากนน กใช composer โหลดลงมาใชเลย
Page 117 of 187
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);
You may also paginate Eloquent models:
ตวอยางโดยใช 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(); ?>Page 118 of 187
เพยงแคนกจะไดการแบงหนาละครบ.
เราสามารถจดการๆ แบงหนาไดโดยฟงกชนตอไปนครบ:
getCurrentPage
getLastPage
getPerPage
getTotal
getFrom
getTo
บางครงเราอยากสรางเองเพราะอาจจะมขอมลทตองผานการคานวนหลายขน กใชเมทอดนเลยครบ Paginator::make
ตวอยาง
$paginator = Paginator::make($items, $totalItems, $perPage);
Appending To Pagination Linksเราสามารทาการเรยงลาดบการแสดงผลไดโดยใชเมทอด appends เหมอนในตวอยาง
<?php echo $users->appends(array('sort' => 'votes'))->links(); ?>
ลงทออกมาหนาตาจะเปนแบบน
http://example.com/something?page=2&sort=votes
Page 119 of 187
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');
ดงคาทงหมดจากตาราง roles โดยเอาแคคอลมน title
$roles = DB::table('roles')->lists('title');
คาทคนมาจะเปนอาเรยนะครบ ถาเราอยากใสคยใหแตละแถวเราใสพารามเตอรตวทสองเขาไป name จะไปเปนคยใหกบtitle
$roles = DB::table('roles')->lists('title', 'name'); Page 120 of 187
เมทอด 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();
ตวอยางการใช where กบ In รวมกน
$users = DB::table('users') ->whereIn('id', array(1, 2, 3))->get();
$users = DB::table('users') ->whereNotIn('id', array(1, 2, 3))->get();
Page 121 of 187
ใชหาแถวทเปนคาวางตามคอลมน
$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');
การจอยแบบเตมควรลงไปชวยประหยดเวลา เวลาคดไมออกวาจะใชฟงกไหนด แทรกควรลงไปตรงๆ เลย:
DB::table('users') ->join('contacts', function($join) { $join->on('users.id', '=', 'contacts.user_id')->orOn(...); }) ->get();
Page 122 of 187
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();
หนาตาของควรจะออกมาเปนแบบน
select * from userswhere exists ( select 1 from orders where orders.user_id = users.id)
Aggregates การหาผลรวมชนดตางๆPage 123 of 187
ตวอยางการคานวนคา
$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();
การเพมและลดคาใหคอลมน
DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);
การกาหนดคาคอลมนทจะเพมคาให Page 124 of 187
DB::table('users')->increment('votes', 1, array('name' => 'John'));
การเพมขอมล
ตวอยาง
DB::table('users')->insert( array('email' => '[email protected]', 'votes' => 0));
การเพมคาพรอมกบเพมคา id ดวย
$id = DB::table('users')->insertGetId( array('email' => '[email protected]', 'votes' => 0));
หมายเหต: ถาใช PostgreSQL เมทอด insertGetId คาดหวงวาจะใชคอลมน "id" เปนตวทมนจะเพมให
การเพมหลายๆขอมล
DB::table('users')->insert(array( array('email' => '[email protected]', 'votes' => 0), array('email' => '[email protected]', 'votes' => 0),));
การแกไข
ตวอยาง
DB::table('users') ->where('id', 1) ->update(array('votes' => 1));
การลบPage 125 of 187
ตวอยาง
DB::table('users')->where('votes', '<', 100)->delete();
การลบขอมลทงหมดเปนการลบแบบแถวตอแถว
DB::table('users')->delete();
การลบแบบลบทงตารางดวยแลวสรางขนใหม
DB::table('users')->truncate();
การทา Unionsunion คอการจบผลลพทของการ selecet 2 ครง มารวมกนเปนหนงผลลพท Performing A Query Union
$first = DB::table('users')->whereNull('first_name');
$users = DB::table('users')->whereNull('last_name')->union($first)->get();
เมทอด unionAll ใชงานเหมอนกบ union เลยครบ
Caching Queriesเราสามารถทาการแคชหรอบนทกผลการควรไวบน session กอนดวยเมทอด remember
ตวอยาง
$users = DB::table('users')->remember(10)->get();
ในตวอยางเราจะแคชผลการคนหานเปนเวลา 10 นาท ระหวางนการควรจากตวอยางจะไมไปดงขอมลจากฐานขอมลแตจะดงจากแคชจนกวาจะหมดเวลาครบ
Page 126 of 187
Queuesคลาสทชวยเรยงลาดบการทางานของฟงกชนตางๆ
การตงคา
Laravel Queue เตรยมฟงกชนทใชในการเขาถง api ของเวบทใหบรการควไว การควคอการเรยงลาดบงานของเวบไซตเชน เรามเมลทตองสงถง 1000 ฉบบถาสงแบบเดม server อาจจะรบไมไหว เราจงมคลาส queue มาเพอการนครบ
ไฟลทใชตงคาเกบไวท app/config/queue.php. ในไฟลจะมขอมลทเราตองใชในการเชอมตอผใหบรการคว เชนBeanstalkd, IronMQ, Amazon SQS, and synchronous (สาหรบการทดสอบในเครอง)
ชอคลาสของผใหบรการควทเราจะปอนเขาไป:
Beanstalkd: pda/pheanstalkAmazon SQS: aws/aws-sdk-phpIronMQ: iron-io/iron_mq
การใชงานเบองตน
ในการสงงานใหมเขาไปในควเราใชฟงกชน Queue::push
Pushing A Job Onto The Queue
Queue::push('SendEmail', array('message' => $message));
พารามเตอรตวแรกเปน ฟงชนทเราใชควบคมควน. ตวทสองเปนขอมลทเราจะทาการคว
ตวอยางฟงกชนทใชควบคมการคว
class SendEmail { Page 127 of 187
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();} Page 128 of 187
เราสามารถกาหนดเวลาทจะหนวงไวกอนทจะสงใหงานตอไปทางานไดแบบนครบ
$job->release(5);
เมองานทเขาควเกดขอผดพลาดขน จะถกนากลบไปตอควใหม เราสามารถตรวจสอบการทางานใหมไดโดยฟงกชนattempts
ตรวจหางานทมการพยายามทามากกวา 3 ครง
if ($job->attempts() > 3){ //}
การเรยกขอมลของาน
$job->getJobId();
Queueing Closuresเราสามารถใชงานฟงกชนทไมมชอในการสรางงานไดโดยตวอยางเลยครบ
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กอนทาการคว. Page 129 of 187
Running The Queue ListenerLaravel เตรยมคาสงqueue:listen เพอรอรบคาขอทมากจากผใหบรการ
ตวอยางการใชงาน
php artisan queue:listen
เราสามารถกาหนดคาการเชอมตอเสรมลงไปได:
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:
ตวอยาง Page 130 of 187
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 จะดแลการทางานของควให
Page 131 of 187
RedisRedis เปนโอเพนซอรสฐานขอมลขนาดเลก ทเกบขอมลในรปแบบ คยกบคา หนงคาตองมคยกากบ ประมาณนครบอยากรจกมากกวานตองลองไปเลนท try redis โดยขอมลทอยในนจะม strings, hashes, lists, sets, และ sorted sets.
การปรบแตง
การปรบแตง redis เราทาใน app/config/database.php ในนเราจะเหนอาเรยชอ redis แบบนครบ
'redis' => array(
'cluster' => true,
'default' => array('host' => '127.0.0.1', 'port' => 6379),
),
โดยคาเรมตนเเลว ถกตงใหสนบสนนการพฒนาบนเครอง เราสามารถปรบแตงไดตามใจครบ อาเรยชอ clusterใชเพอบอกให redis ทอยในเครองทาการ client-side sharding ขาม Redis nodes ของคณ, ทาใหเราสามารถสรางram จานวนมากได. แตการทา client-side sharding แตเราไมสามารถจบการ failover ได
การใชงาน
เราสามารถสรางตวแปรทเปนตวแทนของเมทอด Redis::connection โดยการ
$redis = Redis::connection();
เรายงไมไดกาหนดชอ server redis ของเราตองกาหนดกอนนะครบ
$redis = Redis::connection('other');
ถาอยากศกษาตอไปทนครบ Redis commands ในการจดการตางๆ laravel มฟงกชนตางๆ มาใหเเลวครบ: Page 132 of 187
$redis->set('name', 'Taylor');
$name = $redis->get('name');
$values = $redis->lrange('names', 5, 10);
ถาไมตองการใชคาสง laravel กสามารถใชเมทอด command ในการใชคาสงของ redis ตรงๆได
$values = $redis->command('lrange', array(5, 10));
คลาส Redis ทเปนตว static คลาสครบ:
Redis::set('name', 'Taylor');
$name = Redis::get('name');
$values = Redis::lrange('names', 5, 10);
PipeliningPipelining คอการสงคาสงหลายๆ ตวไปยง redis server laravel มเมทอด pipeline มาใหใช
ตวอยาง
Redis::pipeline(function($pipe){ for ($i = 0; $i < 1000; $i++) { $pipe->set("key:$i", $i); }});
Page 133 of 187
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');
CookiesPage 134 of 187
การดงคาจาก cookies
$value = Cookie::get('name');
สราง cookie และสงคนไปใหผใชงาน
$response = Response::make('Hello World');
$response->withCookie(Cookie::make('name', 'value', $minutes));
สราง cookie ทไมหมดอาย
$cookie = Cookie::forever('name', 'value');
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'));
การดงคาจากในฟอรมเกา Page 135 of 187
Input::old('username');
Filesรบคาจากการอพโหลดไฟล
$file = Input::file('photo');
ตรวจวาไฟลถกอพโหลดไหม
if (Input::hasFile('photo')){ //}
คาทถกคนมาจะเปนเมทอด 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();
ดงคาขนาดของไฟล Page 136 of 187
$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/*')){ //}
ดงคา url ของคารองขอ
$url = Request::url();
ดงคา URI เฉพาะสวน
$segment = Request::segment(1); // http::/taqmaninw.com/admin/post/id?=3// $sengment ����
����� admin
**ดงคา header **
$value = Request::header('Content-Type');Page 137 of 187
ดงคาจากตวแปร $_SERVER
$value = Request::server('PATH_INFO');
ตรวจวาคาขอเปน ajax ไหม
if (Request::ajax()){ //}
ตรวจวาคาขอมาจาก https ไหม
if (Request::secure()){ //}
Page 138 of 187
Views & 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 การสงกลบ Page 139 of 187
สงกลบไปท route
return Redirect::to('user/login');
สงกลบไปพรอมกบ ขอความ
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));
Views Page 140 of 187
Views คอสวนทใชเกบไฟลทใชสรางหนา 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');
การสง 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);Page 141 of 187
ผลทออกมาครบ
<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());});
ถาเราตองการทาใหเปนคลาสเพองายตอการจดกลม เราตองทาแบบนครบ
View::composer('profile', 'ProfileComposer');
สรางคลาสขนมา
class ProfileComposer { Page 142 of 187
public function compose($view) { $view->with('count', User::count()); }
}
แลวอยาลมเพมเขาไปทไฟล composer.json
การสงกลบแบบพเศษ
สรางการสงกลบในรปแบบของ json
return Response::json(array('name' => 'Steve', 'state' => 'CA'));
สรางการสงกลบในรปแบบของ jsonp
return Response::json(array('name' => 'Steve', 'state' => 'CA'))->setCallback(Input::get('callback'));
สรางการสงกลบในรปแบบของการดาวนโหลดไฟล
return Response::download($pathToFile);
return Response::download($pathToFile, $name, $headers);
Page 143 of 187
Routingใชในการกาหนดวาเมอเราเรยกลงนจะใหทาอะไรขนบาง
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';});
กาหนด route ในการเรยกพารามเตอร foo ในทกรปแบบเมทอด
Route::any('foo', function(){ return 'Hello World';});
ลงทเรยกมาตองเปน https เทานน
Route::get('foo', array('https', function(){ Page 144 of 187
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){ //}) Page 145 of 187
->where('id', '[0-9]+');
จะใสไปเปนอาเรยกได
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!';}));
การใส route หลายตว
Route::get('user', array('before' => 'auth|old', function(){ return 'You are authenticated and over 200 years old!';
Page 146 of 187
}));
การกาหนดคาเฉพาะให 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){ //});
Pattern Based Filters
เราสามารถกาหนด filter ใหทางานเฉพาะเมอมการเรยกตรงกบทเรากาหนดได ตามตวอยางเลยครบ.
Route::filter('admin', function(){ //});
Route::when('admin/*', 'admin');
ตามตวอยางเราเพม filter ชอ admin เขากบทกลงทม admin/ อยขางใน
แลวกยงสามารถกาหนดเมทอดใหไดดวยPage 147 of 187
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'));
ตอนนเราใชชอยอ เพอสรางลงไดเเลวPage 148 of 187
$url = URL::route('profile');
$redirect = Redirect::route('profile');
เราใชเมทอด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) { // });
}); Page 149 of 187
Route Prefixingในการกาหนดคาทใชกาหนดกลมของ เราใช prefix ในการตรวจสอบ
ตวอยางการใช prefix
Route::group(array('prefix' => 'admin'), function(){
Route::get('user', function() { // });
});
Route Model Bindingคอการผกโมเดลเขาไปกบ Route โดยใชเมทอด Route::model
การใชงาน
Route::model('user', 'User');
ตอมากกาหนดใหเมอมการเรยกลงทม {user}เปนพารามเตอร
Route::get('profile/{user}', function(User $user){ //});
เรากจะทาการแทรก User instance เขาไปใน Route ยกตวอยาง profile/1 ถกเรยก User instance กจะม ID = 1.
ถาพารามเตอรทสงเขามาไมตรงกบ model ใดๆเราสามารถกาหนดการแสดงขอผดพลาดาได Page 150 of 187
Route::model('user', 'User', function(){ throw new NotFoundException;});
ตอมา เมทอด Route::bind เปนการผกพารามเตอรเขากบ โมเดล เมอมการสงคาเขาตรงกบ routeทกาหนดคากจะกจะถกสงมาทเมทอดนกอน
Route::bind('user', function($value, $route){ return User::where('name', $value)->first();});
Page 151 of 187
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');
เพมคอลมน Page 152 of 187
ในการแกไขตารางเราใชคาสง Schema::table
Schema::table('users', function($table){ $table->string('email');});
ตารางคาสงตางของคลาส Blueprint ครบ
Command Description
$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 Page 153 of 187
$table->timestamp('added_on'); คาทออกมาจะเปน TIMESTAMP
$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 dสามารถใชเมทอด after ทาการเรยงลาดบคอลมน
ตวอยาง
$table->string('name')->after('email');
เปลยนชอ Columnsใชเมทอด renameColumn ครบ
ตวอยาง
Schema::table('users', function($table){ $table->renameColumn('from', 'to'); Page 154 of 187
});
หมายเหต: คอลมนชนด enum ไมสนบสนน
ลบ 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')){ //}
Page 155 of 187
เพม Indexesสรางทง Column และ Index
$table->string('email')->unique();
Command Description
$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'); Page 156 of 187
หมายเหต: ใหชนดของคอลมนทเปนคยเชอมใหเปน unsigned ทกครงกรณทเชอมไปยง คอลมนทเปน intergerและเปน auto_increment ครบ
ลบ Indexesในการลบคยเชอม larave ตงคาคยเปนคาเรมตนใหเเลวนะครบ โดยอางองจากชนดกบชอของตารง
Command Description
$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');});
Page 157 of 187
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');} Page 158 of 187
คา email เราสามารถเปลยนไปตามใจเราไดครบ สวนเมทอด Redirect::intendedใชสงผใชงานกลบไปทลงทเขาเรยกมาครบ
เมอเมทอด attempt ถกเรยก event auth.attempt จะถกเรยกและ event auth.login จะถกเรยกเมอการเขาสระบบสาเรจ
ตรวจสอบวามการลอกอนคางอยไหม
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))){ // �
�� active ��
�� 1 �����
������������������
}
การเขาถงเขอมลคนทลอกอน
$email = Auth::user()->email;
ใชเมทอด loginUsingId เพอดง Id ของคนทลอกอนมา
Auth::loginUsingId(1);
สมมตวาเรากาหนดวาการเปลยนแปลงเลขบตรเครดตตองใชรหสผานยนยนเพมเตม เมทอด validate Page 159 of 187
สามารถทางานนใหเราได
การใชงานการยนยนตวตนโดยไมไดเขาสระบบ
if (Auth::validate($credentials)){ //}
การลอกอนแบบไมม 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 ทถกสงมา Page 160 of 187
Route::post('register', array('before' => 'csrf', function(){ return 'You gave a valid CSRF token!';}));
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();});
การจดการการลมรหสผาน
การลมรหสผานและการสรางใหม
Page 161 of 187
สงรหสผานใหม
laravel เตรยมการมาใหเราสามารถสรางระบบการสและเปลยนรหสผาน ใหเราโดยการให User model ทาการสบทอดIlluminate\Auth\Reminders\RemindableInterface.
การใชงาน 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 เองนะครบPage 162 of 187
เราสามารถสงขอความเพมเตมใหผใชโดยสงพารามเตอรไป $message ไปในฟงกชน remind
return Password::remind($credentials, function($message, $user){ $message->subject('Your Password Reminder');});
โดยคาเรมตนเเลวเมทอด 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"> Page 163 of 187
ตวอยางการสราง 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'); Page 164 of 187
Crypt::setCipher($cipher);
Page 165 of 187
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');Page 166 of 187
ลบคาทงหมด Session
Session::flush();
สราง 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');});
Page 167 of 187
ตอนนเรากใชคาสง php artisab session:table เปนอนจบครบ
Page 168 of 187
Templates
Controller 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 TemplatingBlade template คอคลาสทใชในการเขยน html ขนมาดวย php ทาใหเราสามารถสราง html ทมโครงสรางซบซอนได การจะใชนนตองตงชอไฟลเปน ��
�� view.blade.php
ตวอยางทยงใช html อย
<!-- Stored in app/views/layouts/master.blade.php -->
<html> Page 169 of 187
<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() }}.
ทนเรากใช syntax แบบสนๆ ในการแสดงผลจาก server ไดเเลวPage 170 of 187
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
@while (true) <p>I'm looping forever.</p>@endwhile
การแทรก Views
@include('view.name')
การแสดงภาษา
@lang('language.line')Page 171 of 187
@choice('language.line', 1);
การทาคอมเมน
{{-- This comment will not be in the rendered HTML --}}
Page 172 of 187
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 เกดขนระหวางการทดสอบ
การเรยก Routes ในขณะทดสอบ Page 173 of 187
ตวอยางการเรยก 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!")')); Page 174 of 187
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();} Page 175 of 187
คาดหวงวาจะเปน 403
$this->assertResponseStatus(403);
คาดหวงวาฟงกชนจะสงกลบไปท 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 มเมทอดชวยใหเราทาการทดสอบไดงายๆ เยอะเลยครบ.
Page 176 of 187
เมทอด beใชในการจาลองการลอกอน
ตวอยาง
$user = new User(array('name' => 'John'));
$this->be($user);
ทาการเพมขอมลลงฐานขอมลในขณะทดสอบ
$this->seed();
$this->seed($connection);
Page 177 of 187
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();Page 178 of 187
เมทอด failed ใชในการเขาถงกฏทเราตงไว
$failed = $validator->failed();
การจดการขอความแสดงขอผดพลาด
เมอเรยกเมทอด 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')){ //}
รบขอความแสดงขอผดพลาดโดยใสรปแบบใหดวย Page 179 of 187
echo $messages->first('email', '<p>:message</p>');
หมายเหต: โดยเรมตน, รปแบบขอความจะถกจดในรปแบบทนาไปใชงานรวมกบ twiiter bootstrap ได.
รบขอความแสดงขอผดพลาดทงหมดพรอมใสรปแบบ
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 ทกคารองขอ
Page 180 of 187
เมอทาการรไดเรคเราสามารถเขาถงขอความแสดงขอผดพลาด โดยใชตวแปร$errors ดงตวอยางครบ
<?php echo $errors->first('email'); ?>
กฏในการตรวจสอบท 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,_maxPage 181 of 187
ตรวจสอบวาคาทสงมาเปนมคาอยระหวาง min กบ max ไหม
confirmed
ตรวจสอบวาคาทสงมาเปนมรปแบบของฟอรมทมรปแบบ ชอ_confirmation ยกตวอยางการ ตรวจสอบpassword,วาตรงกบpassword_confirmation ไหม
date
ตรวจสอบวาคาทสงมาเปนมรปแบบของเวลาหลกจากใช strtotime ไหม.
date_format:_format_
ตรวจสอบวาคาทสงมาเปนมรปแบบของเวลาทกาหนดไหม
different:_field_
คาตรง field ตองมคาตางจากคาทปอนเขามาถงจะผาน
ตรวจสอบวาคาทสงมาเปนมรปแบบของ email
exists:_table,_column
ฟอรมทอยในการตรวจสอบตองมชอตรงกบคอลมนในฐานขอมล
การใชงานเบองตน
'state' => 'exists:states'
การใชงานโดยใสคาทตองการตรวจไปหลายคา
'state' => 'exists:states,abbreviation'
เราสามารถกาหนดเงอนไขใหกฏคลายๆการทาควร ครบ Page 182 of 187
'email' => 'exists:staff,email,account_id,1'
image
ตรวจสอบวาคาทสงมาเปนรปภาพมนามสกล(jpeg, png, bmp, or gif) ไหม
in:_foo,_bar,...
ตรวจสอบวาคาทสงมามคาตรงกบคาใน foo,bar ไหม
integer
ตรวจสอบวาคาทสงมามรปแบบของเลขจานวนเตมไหม
ip
ตรวจสอบวาคาทสงมามรปแบบของ IP address.
max:_value_
ตรวจสอบวาคาทสงมามคานอยกวาคาทกาหนดไว
mimes:_foo,_bar,...
ตรวจสอบวาคาทสงมามรปแบบของ mime type ตรงกบทกาหนดไหม
ตวอยางการตรวจสอบนามสกลของไฟล
'photo' => 'mimes:jpeg,bmp,png'
min:_value_
ตรวจสอบวาคาทสงมามจานวนนอยกวาไหมถามนอยกวากไมผาน
not_in:_foo,_bar,... Page 183 of 187
ตรวจสอบวาคาทสงมามคาตรงกบคาทตงไวไหม ถามกไมผานครบ
numeric
ตรวจสอบวาคาทสงมาเปนตวเลขไหม
regex:_pattern_
ตรวจสอบวาคาทสงมามรปแบบกบ regular expression ทกาหนดไวไหม
required
ตรวจสอบวาคาทสงมาเปนคาวางไหม ถาเปนกไมผานครบ
required_if:_field,_value
ตรวจวาคาใน field ตองไมวางและ ตรงกบ value
required_with:_foo,_bar,...
ตรวจวาฟล foo ตองมคาหาก bar มคาดวย
required_without:_foo,_bar,...
ตรวจวาฟล foo ตองมคาหาก bar ไมมคา
same:_field_
ตรวจวาคาทสงเขามาซ ากบคาทกาหนดไวไหม
size:_value_
ตรวจวาคาทสงเขามาตรงกบทกาหนดไวไหม กรณเปนคาจะตรวจสอบจานวนคา เปนตวเลขกเทยบตามคาเปไฟลเทยบตามขนาดของไฟลเปนกโลไบต
unique:_table,_column,_except,_idColumn Page 184 of 187
ตรวจวาคาทสงมาซ ากบในตารางไหม.
ตวอยางการใชตรวจวาอเมลนมในตาราง 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 ไหม
Custom Error Messagesเราสามารถปรบแตงขอความทแสดงขอผดพลาดได
ตวอยาง
$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.', Page 185 of 187
'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!', ),),
การสรางตวตรวจสอบ
เราสามารถสรางฟงกชนในการตรวจสอบไดเองโดย 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:Page 186 of 187
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'; }
}
ตอมาเราตองเอาคลาสของเรามาลงทะเบยน
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);}
Page 187 of 187