12/08/2018, 14:26

Laravel 5.4 - Before release

Laravel 5.4 Laravel 5.4 là version tiếp theo của laravel. Nó hiện đang được phát triển và có thể sẽ được release vào tháng 1 năm 2017. Tuy nhiên chúng ta đã có thể bắt đầu tìm hiểu về phiên bản sắp tới này của laravel. Route improvements Route trong laravel 5.4 có 2 cải thiện mới được bổ ...

Laravel 5.4

Laravel 5.4 là version tiếp theo của laravel. Nó hiện đang được phát triển và có thể sẽ được release vào tháng 1 năm 2017. Tuy nhiên chúng ta đã có thể bắt đầu tìm hiểu về phiên bản sắp tới này của laravel.

Route improvements

Route trong laravel 5.4 có 2 cải thiện mới được bổ sung, route caching tốt hơn cho các ứng dụng lớn và thường xuyên thay đổi

Route Caching Improvements

Lớp route caching chứa những cải tiến mới sẽ cho phép kết hợp route trên các ứng dụng rất lớn, điều đó sẽ cho thấy một sự cải thiện đáng kể. Đặc biệt trong bối cảnh các ứng dụng ngày càng lớn với hàng nghìn routes.

Fluent Registering Routes

Như trước đây, nếu bạn muốn khai báo named route hoặc 1 middleware, bạn cần phải thực hiện nó ở cuối closure:

Route::get('user/{id}/profile', function ($id) {
    //
})->name('profile');

Ở laravel 5.4 bạn có thể khai báo tên cho route ngay ở đầu:

Route::name('profile')->get('user/{id}/profile', function ($id) {
    // some closure action...
});

Registering a route name and a middleware

Route::name('users.index')->middleware('auth')->get('users', function () {
    // some closure action...
});

Registering a middleware with a route prefix and group

Route::middleware('auth')->prefix('api')->group(function () {
    // register some routes...
});

Registering a middleware to a resource controller

Route::middleware('auth')->resource('photo', 'PhotoController');

Laravel Blade Components and Slots

Một tính năng mới sắp được thêm mới trong Laravel 5.4 là khả năng để bạn có thể thêm các Components và Slots vào template Blade. Tính năng này được lấy cảm hứng từ Vue.js và cho phép bạn đơn giản hóa các yếu tố xây dựng HTML vào các khu vực tái sử dụng.

Trong hầu hết các ứng dụng mà bạn có một bố cục tổng thể và các view mở rộng nó:

// layouts/app.blade.php
<!DOCTYPE html>
<html lang="en">
    <head>
    ...
    </head>
    <body>
    @yield('content')

//----------
// home.blade.php
@extends('layouts.app')
@section('content')
    <h1>Home Page</h1>
@endsection

Ví dụ, giả sử chúng ta muốn thêm một cảnh báo cho các trang home. Sử dụng tính năng Blade Components mới, có thể tạo ra một file inc/alert.blade.php và thêm một đặc biệt - biến $ slot:

<div class="alert">
    {{ $slot }}
</div>

Then in your home.blade.php file:

@extends('welcome')

@section('content')
<div>
    <h1>Home Page</h1>
    @component('inc.alert')
        This is the alert message here.
    @endcomponent
</div>
@endsection

Điều này cho phép bạn dễ dàng xác định các văn bản hoặc HTML sẽ xuất hiện trong các $slot.

Reimagining Views with Slots and Components

Một ví dụ đơn giản của việc tạo ra một alert, bây giờ bạn có thể làm những việc như có một layout cơ bản với một biến $slot và sử dụng các views con định hướng thiết kế. Dưới đây là một ví dụ:

// layouts/app.blade.php
<html>
    <head>
        <title>{{ $title or 'Laravel News' }}</title>
    </head>

    <body>
        <div class="container">
            {{ $slot }}
        </div>
    </body>
</html>

Sau đó, nếu bạn gọi home.blade.php bạn có thể làm như sau:

@component('layouts.app')
    @slot('title')
        Home Page
    @endslot

    <div class="col-6">
        @component('inc.alert')
            This is the alert message here.
        @endcomponent
        <h1>Welcome</h1>
    </div>
    <div class="col-6">
        @component('inc.sidebar')
            This is my sidebar text.
        @endcomponent
    </div>
@endcomponent

Với cách làm này, @slot('title') phân tích thành một biến title và tất cả mọi thứ bên trong một @component trở thành một biến $slot được sử dụng trong, nó được gọi là view.

Higher Order Messaging for Collections

Một trong những tính năng mới của laravel 5.4 là “higher order” messages cho Collections, nó được đóng góp bởi @franzliedke.

Để hiểu rõ hơn như thế nào là higher order messaging, chúng ta hãy xem ví dụ sau. Giả sử bạn có một collection và bạn muốn thực hiện một phương thức trên mỗi phần tử của colletion đó. Đơn giản bạn chỉ cần sử dụng phương thức each có sẵn của collection sau đó sử dụng callback để thực hiện phương thức mong muốn:

$invoices->each(function($invoice) {
    $invoice->pay();
});

Tuy nhiên, với tính năng mới này, mọi thứ sẽ đơng giản hơn rất nhiều:

$invoices->each->pay();

Một ví dụ khác:

// Before
$employees->reject(function($employee) {
    return $employee->retired;
})->each(function($employee){
    $employee->sendPayment();
});

// 5.4
$employees->reject->retired->each->sendPayment();

JSON Based Language Files

Một trong những yêu cầu mà những lập trình viên sử dụng laravel mong muốn nhất là việc hỗ trợ tốt hơn cho ứng dụng web đa ngôn ngữ. Hiện tại, đã có một vài packages bổ sung số tính năng để Laravel để xử lý tốt hơn trong các dự án đa ngôn ngữ, nhưng một trong những vấn đề nhức nhối khi xây dựng các ứng dụng như là quản lý translation keys.

Trong version trước của laravel, bạn có thể thêm các đoạn translate bằng cách sử phương thức trans() hoặc trans_choice():

trans('auth.verification_number_instructions')

Và sau đó bạn cần thêm translations cho các keys trong tất cả các ngôn ngữ mà bạn hỗ trợ, ví dụ với English, bạn cần có một file resources/lang/en/auth.php có cấu trúc giống như:

<?php

return [
    'auth.verification_number_instructions' => 'Please enter your 4-digit verification number:'
];

Với các dự án nhỏ, số lượng translation keys không lớn và không khó để quản lý. Tuy nhiên, với các ứng dụng lớn có tá keys, việc bạn nhớ tất cả số đó thực sự khiến bạn đau đầu. Vì vậy, laravel 5.4 sẽ đem tới một phương thức hỗ trợ translation mới:

__("Please enter your 4-digit verification number:")

Function mới này sẽ tìm kiếm một file resources/lang/en.json, decode và mang lại giá trị dịch tương ứng cho các dòng dựa trên ngôn ngữ hiện tại của ứng dụng. File JSON có cấu trúc như:

{"Please enter your 4-digit verification number:": "men fadlak adkhel raqam al tareef"}

Chức năng mới này sẽ cho phép các lập trình viên sử dụng các dòng ngôn ngữ rõ ràng, minh bạch trong khi lập trình.

Đối với lý do tại sao tập tin JSON được sử dụng, quyết định được dựa trên thực tế là JSON là dễ đọc hơn bởi cả con người và phần mềm máy tính, chúng tôi tin rằng có dịch được lưu trữ trong JSON mở ra cánh cửa cho các nhà phát triển gói phần mềm để tạo ra các công cụ tốt hơn để xử lý các bản dịch ứng dụng .

Passing parameters to the translator

Sử dụng phương thức __() bạn có thể truyền parameters tới translator giống như chúng ta sử dụng trong version trước đó của laravel:

__(
    "Hello :name, you have :unread messages",
    ['name' => $user->name, 'unread' => $notifications->count]
)

Điều mới mẻ ở đây là thay thế tham số sẽ xảy ra ngay cả khi dòng ngôn ngữ không được tìm thấy, có nghĩa là bạn thậm chí không cần phải xây dựng một file translation cho các ứng dụng của bạn bằng ngôn ngữ chính. Vì vậy, trong ví dụ trên, ngay cả khi không có file en.json, đầu ra của phương thức sẽ là một cái gì đó như:

Hello Mohamed, you have 23 messages.

Translation lines in Blade

Trong version 5.4 này, laravel sẽ bổ sung thêm một tag điều khiển tương tự @if hay @else, đó là @trans. Nó gần tương tự khi bạn sử dụng phương thức trans():

@trans(['name' => $user->name, 'unread' => $notifications->count])
    Hello :name, you have :unread messages.
@endtrans

Markdown in Your Emails

Laravel 5.4 sẽ bao gồm một hệ thống Markdown toàn mới để tạo template email.

Email Components

Nó đi kèm bao gồm với các thành phần thư sau đây:

  • button
  • footer
  • header
  • layout
  • message
  • panel
  • promotion
  • subcopy
  • table

Trong template email của bạn, bạn có thể sử dụng như sau:

@component('mail::button', ['url' => $actionUrl, 'color' => $color])
{{ $actionText }}
@endcomponent

Using Markdown for Mailables

Một khi bạn sử dụng 5.4, để bắt đầu sử dụng markdown trong Mailables của bạn, tất cả những gì bạn cần là sử dụng ->markdown trong phương thức build:

return $this->markdown('emails.thanks');

Sau đó, trong email "thanks", bạn có thể sử dụng bất cứ components trong danh sách phía trên, ví dụ:

Laravel Markdown Emails

Using Markdown for Notifications

Notifications đang chuyển sang cách này theo mặc định, và không có bất cứ điều gì bạn đặc biệt cần phải làm. Tuy nhiên, nếu bạn muốn tùy chỉnh tin nhắn thông báo của bạn, bạn có thể sử dụng Artisan để đưa template vào resource của bạn với:

php artisan vendor:publish --tag=laravel-notifications
0