0

New Features in Laravel 5.3 (P2)

ME6tgVZNTAmfdTb5H0GG_laravel-5-3-new-features-updates.png

INDEX

New Features in Laravel 5.3 (P1)

New Features in Laravel 5.3 (P2)

Lời mở đầu

Tiếp tục với các chuỗi bài viết về các tính năng mới của laravel 5.3, ngày hôm nay chúng ta sẽ nói về các tính năng khác của laravel. Đó là :

- Nâng cao các phép so sánh trong Collection::where Laravel 5.3

- Validate kích thước ảnh upload lên hệ thống

- Sự thay đổi về điều hướng trong laravel 5.3

- Giới thiệu về laravel Scout

Nào, giờ thì LET GO :

I, Nâng cao các phép so sánh trong Collection::where Laravel 5.3

Nếu bạn muốn tìm nhiều bản ghi với những điều kiện cụ thể, vậy thì thật dễ dàng ... Chúng ta có thể sử dụng phương thức filter() hoặc reject() ... Ví dụ:

$vips = $people->filter(function ($person) {
    return $person->status === 'vip';
});

$nonVips = $people->reject(function ($person) {
    return $person->status === 'vip';
});

Phương pháp trên là 1 điểm mới của laravel 5.3, tuy nhiên bạn cũng có thể sử dụng cách đơn giản hơn đã được cung cấp từ cá phiên bản trước :

$vips = $people->where('status', 'vip');

Với cách làm như trên, ở các version trước chúng ta hiểu rằng phép so sánh sẽ là (===) như ví dụ với filter và reject bên trên tuy nhiên với version 5.3 thì phép so sánh đã được buông lỏng hơn (==) ... Và đương nhiên là chúng ta vẫn có thể thay đổi phép so sánh như trong ở các phiên bản trước ... Cụ thể như sau :

$nonVips = $people->where('status', '!==', 'vip');
$popularPosts = $posts->where('views', '>', 500);
$firstTimeUsers = $people->where('logins', '===', 1);

II, Validate kích thước ảnh upload lên hệ thống

Gần đây mình có làm một task nhỏ về việc upload ảnh lên làm logo cho user, thực sự việc này chả có gì nếu như mà bên design thiết kế font-end chỗ logo vs 1 kích thước cố định và ko thể thay đổi nếu ko sẽ làm hỏng cấu trúc giao diện -> phương pháp là set chiều dài chiều rộng bằng css cho bức ảnh trên font-end ... OK, phương pháp rất triệt để tuy nhiên lại làm mất tỷ lệ hình ảnh và xấu đi logo của khách hàng ...

Vậy có cách nào triệt để hơn ko, lúc đó mình nghĩ nếu mà validate được size ảnh thì thật tuyệt, không phải lo vấn đề size nữa, tuy nhiên các phiên bản laravel trước ko có cái validate này và thật tuyệt là laravel 5.3 thì lại có (ngon) ... Với validate cho image, chúng ta cần gọi đến rule dimensions và kiểm xoát kích thước ảnh thông qua các các thông số sau :

  • min_width: Hình ảnh bé hơn chiều rộng (tính theo pixel) này sẽ bị từ chối
  • max_width: hình ảnh rộng hơn chiều rộng (tính theo pixel) này sẽ bị từ chối
  • min_height: hình ảnh ngắn hơn so với chiều cao điểm ảnh (tính theo pixel) này sẽ bị từ chối
  • max_height: hình ảnh cao hơn so với chiều cao điểm ảnh (tính theo pixel) này sẽ bị từ chối
  • width: Hình ảnh không chính xác chiều rộng (tính theo pixel) này sẽ bị từ chối
  • height: hình ảnh không chính xác chiều cao điểm ảnh (tính theo pixel) này sẽ bị từ chối
  • ratio: Hình ảnh không chính xác tỷ lệ này (chiều rộng / chiều cao, thể hiện như "chiều rộng / chiều cao") sẽ bị từ chối (tính theo pixel)

Ví dụ :

public function postImage(Request $request)
{
    $this->validate($request, [
         'avatar' => 'dimensions:min_width=250,min_height=500'
    ]);

    // or...

    $this->validate($request, [
         'avatar' => 'dimensions:min_width=500,max_width=1500'
    ]);

    // or...

    $this->validate($request, [
         'avatar' => 'dimensions:width=100,height=100'
    ]);

    // or...

    // Ensures that the width of the image is 1.5x the height
    $this->validate($request, [
         'avatar' => 'dimensions:ratio=3/2'
    ]);
}

III, Sự thay đổi về điều hướng trong laravel 5.3

Với một ưng dụng chúng ta thấy thì chúng có 2 chức năng chính là website 'bình thường' và phần API là nơi cung cấp dữ liệu ra bên ngoài cho các ứng dụng khác hoặc bản thân ứng dụng (1 ứng dụng có thể có cả 2 chức năng hoặc 1 trong 2 chức năng trên).

Trong router của laravel 5.2 chúng ta dễ dàng thấy được điều này vì nó chia app ứng dụng ra thành 2 groups web and api (đây là 2 group defautl và chúng ta có thể custom ra group khác nữa dựa vào các middleware) :

  • Group web chứa mọi thứ mà user bình thường cần: sessions, cookies, CSRF protection, vân vân mây mây.

  • Group api thì "nhẹ nhàng hơn" nó chỉ chứa middleware "throttle", quản lý những trường hợp stateless REST API.

Ở phiên bản 5.3 routes được định nghĩa trong thư mục gốc routes/ và được chia làm 2 file web.phpapi.php. Và có thể đoán, web.php được xử lý bởi web middleware và api.php được xử lý bởi api middleware.

Tại sao lại có sự thay đổi này, đương nhiên là có nguyên nhân của nó :

  • Phân biệt được rõ ràng giưa web thường và web api
  • Với việc có nhiều file route sẽ giúp cho các dev có thể tự quản lý chính các router do bản thân mình thiết kế
  • Việc dời routes ra khỏi thư mục app/ khiến người mới dễ dàng tiếp cận hơn, đồng thời khiến app/ hoàn toàn trở thành thư mục chuẩn PSR-4-autoloaded.

Nếu bạn muốn custome ra 1 file router cho riêng mình (thêm middleware hoặc thêm 1 file router) cập nhật provider App\Providers\RouteServiceProvider . Đơn giản như sau :

 public function map()
{
    $this->mapWebRoutes();

    $this->mapApiRoutes();
}

protected function mapWebRoutes()
{
    Route::group([
        'namespace' => $this->namespace, 'middleware' => 'web',
    ], function ($router) {
        require base_path('routes/web.php');
    });
}

protected function mapApiRoutes()
{
    Route::group([
        'middleware' => ['api', 'auth:api'],
        'namespace' => $this->namespace,
        'prefix' => 'api',
    ], function ($router) {
        require base_path('routes/api.php');
    });
}

IV, Giới thiệu về laravel Scout

Laravel Scout là full-text search dựa trên driver cho Eloquent. Scout hỗ trợ việc đánh index và tìm kiếm nội dung trong Eloquent models. Hiện tại Scout làm việc được với Algolia, nhưng Taylor Otwell đang tham khảo ý kiến cộng đồng về những dịch vụ full-text search khác như ElasticSearch.

Scout là một Laravel package riêng biệt, giống như Cashier, bạn cần phải cài đặt nó với Composer. Cần phải thêm trait s của Scoute vào model để báo cho nó biết cần phải lắng nghe những sự kiện khi một thể hiện của model được sửa đổi và cập nhật search index.

1, Cài đặt.

  • Download package thông qua composer :

      composer require laravel/scout
    
  • Thêm provider của scout (Laravel\Scout\ScoutServiceProvider::class) vào trong phần provider trong file config/app

  • Chúng ta cần cập nhật các thông tin cấu hình của scout. Chạy lệnh php artisan vendor:publish để copy file config cùa Scout ra thư mục config và chúng ta sẽ có file config/scout.php

  • Cuối cùng, nếu bạn đăng sử dụng Algolia thì cần cài đặt Algolia SDK vào thôi :

     composer require algolia/algoliasearch-client-php
    

2, Cấu hình với model sử dụng Scout.

  • Import Laravel\Scout\Searchable trait vào model
  • Với mỗi model, scout sẽ tự sinh ra 1 key chứa tất cả các dữ liệu của model đó để , nói 1 cách dễ hiểu hơn thì nó là tiêu trí đánh dấu như table trong sql vậy ... Mặc định thì key này có dạng : (table-name-dang-số-nhiều)_index ... Tuy nhiên bạn cũng có thể tùy biến lại key này vs phương thức searchableAs.
  • Mặc định, thì dữ liệu đầu ra của Scout sẽ là mảng .... Tuy nhiên, nếu bạn muốn tùy chỉnh dữ liệu ra này thì bạn cũng có thể sử dụng phương thức toSearchableArray.

Ví dụ cụ thể cho các bạn dễ hiểu :

namespace App;

use Laravel\Scout\Searchable;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use Searchable;

    public function searchableAs()
    {
        return 'posts_index';
    }

    public function toSearchableArray()
    {
        $array = $this->toArray();

        // Customize array...

        return $array;
    }
}

3, Thêm mới và update

  • Nếu bạn có 1 bản ghi mới (hoặc muốn cập nhật) thì có thể dụng method save() để tự động thêm mới dữ liệu và đánh index cho bản ghi đó. Ví dụ :

          $order = new App\Order;
    
          // ...
    
          $order->save();
    
  • Thêm mới (cập nhật) thông qua query :

      // Thêm mới (cập nhật) với Eloquent query...
      App\Order::where('price', '>', 100)->searchable();
    
      // Thêm mới (cập nhật) thông qua relationship
      $user->orders()->searchable();
    
      // Thêm mới (cập nhật) thông qua collections...
      $orders->searchable();
    
  • Và nếu như bạn có 1 bảng dữ liệu chưa sử dụng scout này mà muốn import toàn bộ vào scout thì cũng có thể sử dụng lệnh sau:

      php artisan scout:import "App\Order"
    

4, Delete

  • Để loại bỏ một bản ghi với index, chỉ đơn giản là xóa nó từ các cơ sở dữ liệu. Đây là hình thức loại bỏ thậm chí còn tương thích với các mô hình sort_delete:

      $order = App\Order::find(1);
    
      $order->delete();
    
  • Xóa thông qua query :

      // Xóa qua Eloquent query...
      App\Order::where('price', '>', 100)->unsearchable();
    
      // Ban cũng có thể xóa qua relationships...
      $user->orders()->unsearchable();
    
      // Xóa với collections...
      $orders->unsearchable();
    

5, Tim kiếm

Việc truy vấn dữ liệu thực ra cũng không có gì khác so với các model bình thường, ban có thể từ ví dụ sau đây để thấy được quy luật :

Order::search('search key')->get();
Order::search('search key')->paginate(20);
Order::search('search key')->where('account_id', 2)->get();

OK, đến đây mình xin kết thúc bài tìm hiểu tại đây ... Chủ đề này vẫn còn nhiều cái để viết nên hẹn các bạn vào bài viết sau nhé !

V : TÀI LIỆU THAM KHẢO


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí