โอโหพึ่งเขียนโพส มีอะไรใหม่บ้างใน Laravel 6 ได้ไม่นานก็คลอดเวอร์ชั่น 7 แล้วเร็วแบบสุดขั่วแต่ขอบอกเลยว่าฟังก์ชั่นใหม่ที่จะพูดถึงต่อไปนี้ ว้าวแน่นอน แต่ก่อนอื่นบอกไว้ก่อนว่า Laravel 7 นั้นจะปล่อยวันที่ 3 มีนาคม 2563 เรียกว่า ITTHIPAT.me อัพเดทข่าวแบบทันเหตุการเลยทีเดียวเอาละมาดูข้อมูลการ support version นี้กันก่อน
เวอร์ชั่น | วันที่ปล่อย | จะแก้บัคถึงวันที่ | อัพเดทความปลอดภัยถึงวันที่ |
---|---|---|---|
6 (LTS) | 3 กันยายน 2019 | 3 กันยายน 2021 | 3 กันยายน 2022 |
7 | 3 มีนาคม 2020 | 3 กันยายน 2020 | 3 มีนาคม 2021 |
ในเวอร์ชั่นนี้ก็มีการแจ้งวันที่ต่างๆเกี่ยวกับเวอร์ชั่น แต่เชื่อว่าน่าจะประกาศอีกครั้งตอนเปิดตัว ตารางด้านบนเป็นวันที่คร่าวๆของการอัพเดทและแก้ไขบัคต่างๆ สามารถอ่านเรื่อง LTS เวอร์ชั่นเพิ่มเติมได้ที่นี่
มีอะไรใหม่ใน Laravel 7
- Laravel Airlock
- Zttp for HTTP client
- CORS Support
- Custom Eloquent Cast
- Fluent String Operations
- Blade X
- Customizable Stubs
- Query Time Casts
- Multiple Mail Driver
- New Artisan Command
Laravel 7 มีการปรับ Performance อะไรบ้าง
- Route Model Binding Improvements
- 2x Faster Route
- Database queue improvements
- Markdown Mail Template Improvements
- and more variety of bug fixes and improvements.
Laravel Airlock
Laravel Airlock คือ official package ของทาง laravel เอาไว้ใช้จัดการ Authentication API แบบง่ายๆ เช่น token base API เพื่อเอาไว้ทำ token สำหรับ API หรือให้ เว็บแบบ SPA, Mobile Application ไว้ใช้งาน อ่าน Document เพิ่มเติม
Zttp for HTTP client
Zttp for HTTP client คือ Package ที่เอาไว้สร้าง Http Request แบบง่ายๆ เช่นยิง POST, GET, PUT, PATCH และอื่นๆ มาดูตัวอย่างกัน
Post Method
<?php
use Illuminate\Support\Facades\Http;
$response = Http::post($url);
$response = Http::post($url, [
'site' => 'Laravel Article',
]);
Get Method
$response = Http::get($url);
$response = Http::get($url,['foo'=>'bar']);
หลังจากเห็นบอกได้เลยว่าลืม Guzzle HTTP Client ไปได้เลย
CORS Support
ใครติดปัญหายิง API มาแล้วติด คอ เอ้ยติด CORS ในเวอร์ชั่น 7 นี้เค้าใส่ middleware มาให้เลยนะจ๊ะแค่มานั่ง config ใน project เอาไม่ต้องโหลด package เพิ่มเติมแล้วจ้า
Custom Eloquent Cast
Custom Eloquent Cast ใครที่เคยใช้ Attribute Casting ใน laravel จะทราบดีว่าเราสามารถเปลี่ยนข้อมูลที่ออกมาจาก Database ได้เช่น เปลี่ยน integer ให้เป็น string, เปลี่ยน string เป็น array หรือ integer เป็น Boolean โดยการใส่ code หน้าตาแบบนี้ใน Model
<?php
protected $casts = [
'is_admin' => 'boolean',
];
พอ Laravel 7 ออกมาเราสามารถสร้าง Class สำหรับ Cast data ได้แล้วถามว่าดียังไง ตอบเลยว่าดีสุดๆ เพราะปกติแล้วเราจะแปลงได้แค่
integer, real, float, double, decimal:, string, boolean, object, array, collection, date, datetime, and timestamp
ซึงก็ถือว่ามีข้อจำกัดอยู่บ้างแต่พอเรา custom เองได้คุณเอ้ยเปลี่ยน เรือ เป็น รถ ก็ยังได้ฮ่าๆเอาละมาดูวิธีการกัน
ยกตัวอย่างการแปลงข้อมูล JSON
<?php
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
class Json implements CastsAttributes
{
public function get($model, $key, $value, $attributes)
{
return json_decode($value, true);
}
public function set($model, $key, $value, $attributes)
{
return json_encode($value);
}
}
พอเราสร้าง Class เรียบร้อยก็ทำการเรียกใช้ใน Model แบบนี้
<?php
namespace App;
use App\Casts\Json;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $casts = [
'extra' => Json::class,
];
}
เห็นไหมละว๊าวจะตาย
Query Time Casts
หลังจาก Class สำหรับ Casting ไปแล้วมาต่อกันด้วย Cast ตอน Query Database ด้วย withCasts() ฟังก์ชั่นเราสามารถแปลงข้อมูลเฉพาะ Query นั้นๆได้ด้วยโดยไม่ต้องทำเป็น Global cast ก็ได้
$users = User::select([
'users.*',
'last_posted_at' => Post::selectRaw('MAX(created_at)')->whereColumn('user_id', 'users.id')
])
->withCasts(['last_posted_at' => 'date'])
->get();
Fluent String Operations
เพิ่ม Function ให้กับ Illuminate\Support\Str class เช่นเราเอา Title ของ Post มาสร้างเป็น Slug ด้วยวิธีการแบบนี้ได้เลย
$currentVersion = (string) Str::of(' Laravel 6.x ');
return $currentVersion->trim()
->replace('6.x', '7.x')
->slug();
// laravel-7x
Blade X
โอ้แม่เจ้า Blade template ธรรมดาใครเห็นก็ว่าเทพแล้ว เจอ Blade X เข้าไปถึงกับทุ่มโพเดี้ยม มันคือการสร้าง component คล้ายๆกับ วิธีการสร้าง blade component และการสร้าง component ใน SPA เลยมาดูตัวอย่างกัน
สร้าง Blade x ก่อน
@php($user = $user ?? Auth::user())
@php($size = $size ?? 50)
<img
class="inline-block rounded-full"
src="{{ $user->gravatarUrl($size) }}"
width="{{ $size }}"
height="{{ $size }}"
/>
เอา Blade x มาใช้งาน
<x-avatar/>
<x-avatar size="40" />
<x-avatar size="100" />
บอกเลยว่าเทพมากเพราะปกติถ้าเราใช้ blade component เราต้องมาเขียน @component แล้วก็ตามด้วย slot ต่างๆซึ่งก็ถือว่ายังไม่สะดวกพอเพราะมีความยุ่งยากอยู่ แต่พอ Blade X มาแล้วบอกเลยว่าถูกใจสุดๆ
Multiple Mail Drivers
เราสามารถสร้าง Driver สำหรับส่งเมลหลายๆอันแล้วเรียกใช้ทีเดียวได้เลย ยกตัวอย่างเราอาจจะมี Service mail เช่น mailgun, maildrill, mailchimp เราก็ตั้ง config ไว้จากนั้นก็เรียกใช้แบบนี้
Mail::mailer('mailchimp')
->to($request->user())
->send(new PostUpdated($post));
Mail::mailer('mailgun')
->to($request->user())
->send(new PostUpdated($post));
Route Model Binding Improvements
Route Model Binding Improvements คือการที่เราเรียกใช้ model และ query ข้อมูลทันทีที่มีการเข้า url เช่น /user/{id} พอเข้ามาที่ Controller ข้อมูลของ User id ที่เข้ามาจะถูก Query จาก database ทันที
โดยฟังก์ชั่นที่เพิ่มมาเราสามารถเปลี่ยนให้ตัว Route model สามารถค้นหา Database column อื่นๆนอกจาก id ได้ด้วย
Route::get('posts/{post:slug}', function (App\Post $post) {
return $post;
});
จากตัวอย่าง Route จะค้นหาที่ Post Model โดย Search Column ที่ชื่อว่า “slug” แต่ปกติเราสามารถ set column อื่นนอกจาก id ก็ได้โดยเรียกฟังก์ชั่น getRouteKeyName()
ใน model แต่มันก็ถือว่ายังไม่ flexible เท่าไหร่แต่พอของใหม่นี้มาบอกเลยว้าวมาก เพราะเราสามารถกำหนด Route key แยกกันได้เลยแต่ละ controller, method หรือ Route มัน 2 Model เลยแบบนี้
use App\Post;
use App\User;
Route::get('api/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});
2x Faster Route
Laravel บอกว่าเวอร์ชั่น 7 Route จะเร็วกว่าของเดิม 2 เท่าถ้าทำ route:cache ซึ่งตอนขึ้น production ก็ต้องทำอยู่แล้วรับรองเร็วทะลุนรก
Database queue improvements
ปรับปรุงเรื่องของ queue สำหรับคนที่ใช้ MySQL 8+ ให้ดียิ่งขึ้น
Markdown Mail Template Improvements
ปรับปรุง markdown mail template ให้สวยงามขึ้นด้วยนะ
สรุป
Laravel เวอร์ชั่น 7 น่าใช้มากๆ และผมเชื่อว่าหลังจากมีการปล่อยวันที่ 3 มีนาคม 2536 นี้อาจจะนำเอาบาง Feature กลับไปใส่ใน Laravel 6.x ด้วยเพราะ Laravel 6 เป็น LTS ส่วนใครที่อยากลองใช้งาน Laravel ก็ข้ามไป 7 เลยครับ แต่ใครใช้งาน Production จริงจังอาจจะเบรคไว้ที่ 6.x ก่อนรอเค้าอัพเดทแก้บัคซักระยะค่อยไปทดสอบกันนะครับ