Tuy Laravel 6.0 mới ra mắt cách đây không lâu (tháng 9 năm 2019), nhưng hôm nay laravel đã ra mắt phiên bản thứ 7 với khá nhiều cập nhật lớn và hữu ích: giới thiệu Laravel Airlock, cải thiện tốc độ routing, tùy chỉnh Eloquent casts, Blade component tags, fluent string operations, HTTP client, first-party CORS support, cải tiến scoping cho route model binding, tùy biến stub, cải thiện hàng đợi database, hỗ trợ đồng thời nhiều mail drivers, casts khi truy vấn, command mới test
, sửa lỗi và cải thiện nhiều phần khác. Sau đây là chi tiết:
Laravel Airlock
Laravel Airlock cung cấp một hệ thống authentication gọn nhẹ cho SPAs (single page applications), ứng dụng mobile, và đơn giản hơn là token based APIs. Airlock cho phép mỗi người dùng ứng dụng của bạn có thể tạo ra nhiều API token cho tài khoản của họ. Những token này có thể được cấp abilities / scopes quy định hành động nào mà nó có thể thực hiện.
Để xem thông tin chi tiết về Laravel Airlock, xem chi tiết tại Airlock documentation.
Tùy chỉnh Eloquent Casts
Laravel được tích hợp sẵn sẵn nhiều kiểu cast hữu ích. Tuy nhiên, đôi khi bạn cần định nghĩa kiểu cast khác cho dự án của mình. Bây giờ bạn có thể thực hiện điều đó bằng cách tạo một class implements CastsAttributes interface.
Những class implements interface này phải định nghĩa hai phương thức là get
và set
. Phương thức get
sẽ chuyển đổi giá trị từ DB thành sang kiểu dữ liệu mong muốn. Ngược lại, phương thức set
sẽ chuyển đổi giá trị của trường thành giá trị có thể lưu trữ được trong DB. Vị dụ về cast json
được tích hợp sẵn:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Casts</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Contracts<span class="token punctuation"></span>Database<span class="token punctuation"></span>Eloquent<span class="token punctuation"></span>CastsAttributes</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">Json</span> <span class="token keyword">implements</span> <span class="token class-name">CastsAttributes</span> <span class="token punctuation">{</span> <span class="token comment">/** * Cast the given value. * * @param IlluminateDatabaseEloquentModel $model * @param string $key * @param mixed $value * @param array $attributes * @return array */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token variable">$attributes</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">json_decode</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Prepare the given value for storage. * * @param IlluminateDatabaseEloquentModel $model * @param string $key * @param array $value * @param array $attributes * @return string */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">set</span><span class="token punctuation">(</span><span class="token variable">$model</span><span class="token punctuation">,</span> <span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token variable">$attributes</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">json_encode</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Sau khi định nghĩa kiểu cast, bạn có thể gán cho thuộc tính trong Model thông qua tên class.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Casts<span class="token punctuation"></span>Json</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Database<span class="token punctuation"></span>Eloquent<span class="token punctuation"></span>Model</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token keyword">extends</span> <span class="token class-name">Model</span> <span class="token punctuation">{</span> <span class="token comment">/** * The attributes that should be cast to native types. * * @var array */</span> <span class="token keyword">protected</span> <span class="token variable">$casts</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'options'</span> <span class="token operator">=</span><span class="token operator">></span> Json<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span> |
Để tìm hiểu chi tiết, xem thêm tại Eloquent documentation.
Blade Component Tags & Improvements
Blade components đã được cải tiến, cho phép sử dụng tag, quản lý thuộc tính, component classes, inline view components, … Bởi vì những thay đổi này rất rộng, vui lòng truy cập full Blade component documentation để tìm hiểu một cách đầy đủ nhất.
Tóm lại, từ bây giờ, một component có thể gán với một Class quy định dữ liệu của nó. Tất cả các thuộc tính và phương thức public của Class sẽ có hiệu lực trong component view. Bất kỳ thuộc tính HTML nào khác của component sẽ được lưu vào biến $attribute
.
Ví dụ, chúng ta tạo một component AppViewComponentsAlert như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>View<span class="token punctuation"></span>Components</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>View<span class="token punctuation"></span>Component</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">Alert</span> <span class="token keyword">extends</span> <span class="token class-name">Component</span> <span class="token punctuation">{</span> <span class="token comment">/** * The alert type. * * @var string */</span> <span class="token keyword">public</span> <span class="token variable">$type</span><span class="token punctuation">;</span> <span class="token comment">/** * Create the component instance. * * @param string $type * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span><span class="token variable">$type</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">type</span> <span class="token operator">=</span> <span class="token variable">$type</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Get the class for the given alert type. * * @return string */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">classForType</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">type</span> <span class="token operator">==</span> <span class="token single-quoted-string string">'danger'</span> <span class="token operator">?</span> <span class="token single-quoted-string string">'alert-danger'</span> <span class="token punctuation">:</span> <span class="token single-quoted-string string">'alert-warning'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Get the view / contents that represent the component. * * @return IlluminateViewView|string */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">view</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'components.alert'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
Và template của component trên như sau:
1 2 3 4 5 6 7 8 | <!-- /resources/views/components/alert.blade.php --> <div class="alert {{ $classForType() }}" {{ $attributes }}> {{ $heading }} {{ $slot }} </div> |
Khi đó, component này có thể sử dụng ở template Blade khác bằng cách sử dụng component tag:
1 2 3 4 5 6 7 8 | <x-alert type="error" class="mb-4"> <x-slot name="heading"> Alert content... </x-slot> Default slot content... </x-alert> |
Như đã nói, đây chỉ là một ví dụ rất nhỏ trong số rất nhiều thay đổi của Blade của Laravel 7. Vui lòng tham khảo full Blade component documentation để tìm hiểu chi tiết.
HTTP Client
Bây giờ, Laravel cung cấp một HTTP Client tối giản sử dụng Guzzle HTTP client, cho phép bạn thực hiện các HTTP request một cách nhanh nhất, tập trung vào những trường hợp phổ biến và trải nghiệm của developers. Ví dụ gửi POST request với JSON data:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Support<span class="token punctuation"></span>Facades<span class="token punctuation"></span>Http</span><span class="token punctuation">;</span> <span class="token variable">$response</span> <span class="token operator">=</span> Http<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">withHeaders</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token single-quoted-string string">'X-First'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'foo'</span> <span class="token single-quoted-string string">'X-Second'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'bar'</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">post</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'http://test.com/users'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Taylor'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$response</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'id'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> |
Ngoài ra, HTTP Client còn cung cấp chức năng test tiện dụng:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Http<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">fake</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token comment">// Stub a JSON response for GitHub endpoints...</span> <span class="token single-quoted-string string">'github.com/*'</span> <span class="token operator">=</span><span class="token operator">></span> Http<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">response</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'foo'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'bar'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'Headers'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">// Stub a string response for Google endpoints...</span> <span class="token single-quoted-string string">'google.com/*'</span> <span class="token operator">=</span><span class="token operator">></span> Http<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">response</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Hello World'</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'Headers'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">// Stub a series of responses for Facebook endpoints...</span> <span class="token single-quoted-string string">'facebook.com/*'</span> <span class="token operator">=</span><span class="token operator">></span> Http<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">sequence</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Hello World'</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'foo'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'bar'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">pushStatus</span><span class="token punctuation">(</span><span class="token number">404</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Để tim hiểu thêm về HTTP client, vui lòng truy cập HTTP client documentation.
Fluent String Operations
Như bạn đã biết, Class IlluminateSupportStr cung cấp khá nhiều function hữu ích để thao tác với chuỗi. Laravel 7 cung cấp một thư viện hướng đối tượng hơn để làm việc với chuỗi, dựa trên những function đã có. Bạn có thể tạo một đối tượng IlluminateSupportStringable bằng cách sử dụng phương thức Str::of. Khi đó, nhiều phương thức có thể sử dụng liên tiếp để thao tác với chuỗi:
1 2 3 4 5 | <span class="token keyword">return</span> <span class="token punctuation">(</span>string<span class="token punctuation">)</span> Str<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">of</span><span class="token punctuation">(</span><span class="token single-quoted-string string">' Laravel Framework 6.x '</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'6.x'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'7.x'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">slug</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Để tìm hiểu thêm và các phương thức có sẵn, vui lòng truy cập full documentation.
Cải thiện Route Model Binding
Key Customization
Đôi khi bạn muốn resolve Eloquent models bằng một column khác id. Để làm điều đó, Laravel 7 cho phép chỉ định column trong định nghĩaroute parameter:
1 2 3 4 | Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'api/posts/{post:slug}'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>App<span class="token package">Post</span> <span class="token variable">$post</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$post</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Automatic Scoping
Đôi khi, khi binding ngầm nhiều Eloquent models trong cùng một route, bạn muốn ràng buộc Eloquent model thứ 2 là còn của Eloquent model thứ nhất. Ví dụ, khi bạn muốn truy cập một bài đăng theo slug cho user chỉ định:
1 2 3 4 5 6 7 | <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Post</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>User</span><span class="token punctuation">;</span> Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'api/users/{user}/posts/{post:slug}'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>User <span class="token variable">$user</span><span class="token punctuation">,</span> Post <span class="token variable">$post</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$post</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Khi sử dụng các route parameter lồng nhau, Laravel 7 sẽ tự động giới hạn truy vấn để lấy thông tin nested model theo parent của nó, sử dụng conventions để đoán relationship trong parent model. Trong trường hợp này, giả sử User model có một relationship là posts
(số nhiều của tham số trong route), nó sẽ được sử dụng để lấy thông tin Post model.
Để xem thêm về route model binding, vui lòng truy cập routing documentation.
Multiple Mail Drivers
Laravel 7 cho phép cấu hình nhiều “mailers” cho một ứng dụng. Mỗi cấu hình mailer trong config mail
sẽ có tùy chọn riêng, kể cả “transport”, cho phép ứng dụng của bạn sử dụng các email services khác nhau để gửi email messages. Ví dụ, ứng dụng của bạn có thể sử dụng Postmark để gửi email trực tiếp, đồng thời sử dụng Amazon SES để gửi email hàng loạt.
Mặc định, Laravel sử dụng mailer được thiết lập default
trong file mail
config. Tuy nhiên, bạn có thể sử dụng phương thức mailer
để gửi email bằng mailer chỉ định:
1 2 3 4 | Mail<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">mailer</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'postmark'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">to</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">send</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">OrderShipped</span><span class="token punctuation">(</span><span class="token variable">$order</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Cải thiện tốc độ Route Caching
Laravel 7 bao gồm một phương thức matching compiled mới, cached routes được cache bằng lệnh Artisan route:cache
. Đối với các ứng dụng lớn (khoảng 800 route trở lên), những cải thiện này cho kết quả nhanh gấp 2 lần. Những thay đổi này sẽ tự động được áp dụng mà không cần thay đổi từ hệ thống của bạn.
CORS Support
Laravel 7 bao gồm first-party support để cấu hình Cross-Origin Resource Sharing (CORS) OPTIONS bằng cách tích hợp package Laravel CORS được viết bởi Barry vd. Heuvel. File cấu hình cors
mặc định sẽ được thêm vào trong ứng dụng Laravel.
Để tìm hiểu thêm về CORS support in Laravel 7.x, vui lòng truy cập CORS documentation.
Query Time Casts
Đôi khi, bạn cần áp dụng cast khi thực thi truy vấn, ví dụ như select raw từ table. Ví dụ:
1 2 3 4 5 6 7 8 9 | <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Post</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>User</span><span class="token punctuation">;</span> <span class="token variable">$users</span> <span class="token operator">=</span> User<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token single-quoted-string string">'users.*'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'last_posted_at'</span> <span class="token operator">=</span><span class="token operator">></span> Post<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">selectRaw</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'MAX(created_at)'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">whereColumn</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'user_id'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'users.id'</span><span class="token punctuation">)</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Thuộc tính last_posted_at trong kết quả của query trên là một string. Sẽ thuận tiện hơn nếu chúng ta có thể áp dụng cast thuộc tính này thành date khi thực thi truy vấn. Để thực hiện điều này, chúng ta sử dụng phương thức withCasts được cung cấp bởi Laravel 7:
1 2 3 4 5 6 7 8 | <span class="token variable">$users</span> <span class="token operator">=</span> User<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token single-quoted-string string">'users.*'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'last_posted_at'</span> <span class="token operator">=</span><span class="token operator">></span> Post<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">selectRaw</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'MAX(created_at)'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">whereColumn</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'user_id'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'users.id'</span><span class="token punctuation">)</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">withCasts</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token single-quoted-string string">'last_posted_at'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'date'</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Cải thiện MySQL 8+ Database Queue
Trong các bản phát hành trước đây của Laravel, database
queue không đủ mạnh để sử dụng trong production. Tuy nhiên, Laravel 7 cung cấp các cải tiến cho các ứng dụng sử dụng MySQL 8+. Bằng cách sử dụng mệnh đề FOR UPDATE SKIP LOCKED
và các cải tiến SQL khác, trình database
driver giờ đây có thể được sử dụng một cách an toàn trong các ứng dụng production.
Lệnh Artisan test
Ngoài lệnh phpunit
, từ bây giờ bạn có thể sử dụng lệnh Artisan test
để chạy test. Artisan test runner cung cấp giao diện đẹp hơn và hiển thị nhiều thông tin hơn về test đang chạy. Ngoài ra, runner sẽ tự động dừng lại khi gặp trường hợp fail đầu tiên:
1 2 | php artisan test |
Bất kỳ tham số nào có thể truyền vào lệnh phpunit
cũng có thể được sử dụng với lệnh php artisan test
:
1 2 | php artisan test --group=feature |
Cải thiện Markdown Mail Template
Markdown mail template mặc định đã được làm mới, hiện đại hơn dựa theo Tailwind CSS color palette. Tất nhiên, template này có thể published và tùy chỉnh theo nhu cầu ứng dụng của bạn:
</span> <span class="token punctuation">{</span> Redis<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">throttle</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'key'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">allow</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">every</span><span class="token punctuation">(</span><span class="token number">60</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Lock obtained, process the podcast...</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Unable to obtain lock...</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">release</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
In this example, the job is released for ten seconds if the application is unable to obtain a Redis lock and will continue to be retried up to 25 times. However, the job will fail if three unhandled exceptions are thrown by the job.
Tham khảo: Laravel Release Notes