Laravel 7 ออกแล้ว!! มีอะไรใหม่บ้าง

Laravel เวอร์ชั่น 7 ออกแล้วมีอะไรใหม่
Laravel เวอร์ชั่น 7 ออกแล้วมีอะไรใหม่
Laravel เวอร์ชั่น 7 ออกแล้วมีอะไรใหม่บ้าง

โอโหพึ่งเขียนโพส มีอะไรใหม่บ้างใน Laravel 6 ได้ไม่นานก็คลอดเวอร์ชั่น 7 แล้วเร็วแบบสุดขั่วแต่ขอบอกเลยว่าฟังก์ชั่นใหม่ที่จะพูดถึงต่อไปนี้ ว้าวแน่นอน แต่ก่อนอื่นบอกไว้ก่อนว่า Laravel 7 นั้นจะปล่อยวันที่ 3 มีนาคม 2563 เรียกว่า ITTHIPAT.me อัพเดทข่าวแบบทันเหตุการเลยทีเดียวเอาละมาดูข้อมูลการ support version นี้กันก่อน

เวอร์ชั่นวันที่ปล่อยจะแก้บัคถึงวันที่อัพเดทความปลอดภัยถึงวันที่
6 (LTS)3 กันยายน 20193 กันยายน 20213 กันยายน 2022
73 มีนาคม 20203 กันยายน 20203 มีนาคม 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 ก่อนรอเค้าอัพเดทแก้บัคซักระยะค่อยไปทดสอบกันนะครับ

เกี่ยวกับผู้เขียน

ITTHIPAT

สวัสดีครับผม อิทธิพัทธ์ (เป้) ชอบหาเทคนิคต่างๆที่ทำให้ชีวิต Programmer ง่ายขึ้น ทั้ง Automate, Library ชอบทำ Blog และ Video ถ้ามีเวลานะ!

ขอบคุณทุกคนที่ติดตาม และอ่านบทความของผมครับ ผมหวังว่าความรู้ที่เขียนขึ้นในเว็บไซต์นี้จะช่วยทุกท่านได้ไม่มากก็น้อย 

Scroll to Top