+9

5 Laravel Helpers hữu ích đối với bạn

Bài dịch từ trang laravel-news.com

Laravel cung cấp rất nhiều các helper function giúp cho bạn cảm thấy đơn giản hơn trong việc viết code, tôi khuyến khích bạn nên sử dụng chúng hàng ngày khi bạn làm việc với Laravel. Trong bài viết này tôi muốn chỉ ra một vài helper functions mà tôi thấy ổn.

data_get()

data_get() helper giúp bạn lấy giá trị từ một mảng hoặc object với kí hiệu chấm (.). Hàm này tương tự với hàm array_get(). Tham số thứ ba khi truyền vào là một giá trị tùy chọn, nó được dùng làm giá trị mặc định khi giá trị bạn muốn lấy ra không tồn tại.

$array = ['albums' => ['rock' => ['count' => 75]]];

$count = data_get($array, 'albums.rock.count'); // 75
$avgCost = data_get($array, 'albums.rock.avg_cost', 0); // 0

$object->albums->rock->count = 75;

$count = data_get($object, 'albums.rock.count'); // 75
$avgCost = data_get($object, 'albums.rock.avg_cost', 0); // 0

Nếu bạn sử dụng "wildcard" ( * ) trong kí tự kí hiệu chấm của mình, Laravel sẽ trả về giá trị là một mảng.

$array = ['albums' => ['rock' => ['count' => 75], 'punk' => ['count' => 12]]];
$counts = data_get($array, 'albums.*.count'); // [75, 12]

data_get() helper cho phép bạn tìm kiếm các thành phần trong mảng hoặc object của mình với cú pháp tương đương, đó là điều tuyệt vời vì bạn không phải kiểm tra loại biến bạn có trước khi sử dụng nó.

str_plural()

str_plural() helper hỗ trợ việc chuyển đổi một chuỗi thành dạng số nhiều, đáng tiếc là nó chỉ hỗ trợ tiếng Anh. Tham số thứ hai sẽ cho phép hàm này chọn mẫu số nhiều hoặc số ít. Helper này cũng đủ thông minh để giúp đỡ với những từ "không thể đếm được" hoặc những trường hợp đặc biệt.

str_plural('dog'); // dogs
str_plural('cat'); // cats

str_plural('dog', 2); // dogs
str_plural('cat', 1); // cat

str_plural('child'); // children
str_plural('person'); // people
str_plural('fish'); // fish
str_plural('deer', 2); // deer

str_plural() helper cho phép bạn loại bỏ những dòng code kiểu như thế này.

{{ $count == 1 ? 'dog' : 'dogs' }}

Ngoài ra bạn còn có thể sử dụng str_singular().

route()

route() helper sinh ra một URL tương ứng với tên của route được chỉ định. Tham số thứ hai sẽ giúp helper này nhận ra được biến số của route. Nếu tên biến của route không đúng, Laravel sẽ cố gắng để khớp chúng với các thuộc tính trên route và thêm các tham số còn lại vào cuối URL.

Route::get('burgers', 'BurgersController@index')->name('burgers');
route('burgers'); // http://example.com/burgers
route('burgers', ['order_by' => 'price']); // http://example.com/burgers?order_by=price

Route::get('burgers/{id}', 'BurgersController@show')->name('burgers.show');
route('burgers.show', 1); // http://example.com/burgers/1
route('burgers.show', ['id' => 1]); // http://example.com/burgers/1

Route::get('employees/{id}/{name}', 'EmployeesController@show')->name('employees.show');
route('employees.show', [5, 'chris']); // http://example.com/employees/5/chris
route('employees.show', ['id' => 5, 'name' => 'chris']); // http://example.com/employees/5/chris
route('employees.show', ['id' => 5, 'name' => 'chris', 'hide' => 'email']); // http://example.com/employees/5/chris?hide=email

Với tôi, nếu route chỉ có một biến duy nhất, tôi sẽ viết kiểu này: route('burgers.show', 1). Nếu route mà có từ hai biến trở lên, tôi sẽ chỉ định chính xác tên biến cùng với giá trị của chúng: route('employees.show', ['id' => 5, 'name' => 'chris' ]), Điều này sẽ giúp Laravel helper xác định chính xác các thông số và loại bỏ được các trường hợp không mong đợi.

Nếu bạn truyền một tham số thứ 3 với giá trị false, bạn sẽ nhận được một đường dẫn tương đối thay vì là một giá trị tuyệt đối.

route('burgers.show', 1, false); // /burgers/1

Định tuyến cho sub-domains hoạt động đơn giản như thêm một thuộc tính khác.

Route::domain('{location}.example.com')->group(function () {
    Route::get('employees/{id}/{name}', 'EmployeesController@show')->name('employees.show');
});

route('employees.show', ['location' => 'raleigh', 'id' => 5, 'name' => 'chris']); // http://raleigh.example.com/employees/5/chris

Bạn cũng có thể truyền một Eloquent model vào route()

route('burgers.show', Burger::find(1)); // http://example.com/burgers/1

Điều này có thể được bởi gì base Model class implements UrlRoutable interface. Mặc định là route() sẽ lấy primary key của model, nhưng bạn có thể viết lại chúng bằng cách thêm method getRouteKeyName() vào trong model.

class Burger extends Model
{
    public function getRouteKeyName()
    {
        return 'slug';
    }
}

Và dùng nó.

Route::get('burgers/{slug}', 'BurgersController@show')->name('burgers.show');

route('burgers.show', Burger::find(1)); // http://example.com/burgers/everyones-favorite-burger

abort_if()

abort_if() helper trả về một ngoại lệ nếu biểu thức đã cho là đúng. Tham số thứ ba sẽ cho phép bạn thêm vào nội dụng của đoạn response trả về, còn tham số thứ tư sẽ chấp nhận một mảng của các headers.

abort_if(! Auth::user()->isAdmin(), 403);
abort_if(! Auth::user()->isAdmin(), 403, 'Sorry, you are not an admin');
abort_if(Auth::user()->isCustomer(), 403);

Nhiều người trong chúng ta thường viết những đoạn code tương tự như ví dụ dưới đây, nhưng với abort_if(), chúng ta có thể giảm nó chỉ còn một dòng.

// In "admin" specific controller
public function index()
{
    if (! Auth::user()->isAdmin()) {
        abort(403, 'Sorry, you are not an admin');
    }
}

// better!
public function index()
{
    abort_if(! Auth::user()->isAdmin(), 403);
}

optional()

optional() helper cho phép bạn truy cập vào properties hoặc gọi các methods của một object. Nếu object là null, properties và methods được gọi sẽ trả về giá trị null thay vì một error.

// User 1 exists, with account
$user1 = User::find(1);
$accountId = $user1->account->id; // 123

// User 2 exists, without account
$user2 = User::find(2);
$accountId = $user2->account->id; // PHP Error: Trying to get property of non-object

// Fix without optional()
$accountId = $user2->account ? $user2->account->id : null; // null
$accountId = $user2->account->id ?? null; // null

// Fix with optional()
$accountId = optional($user2->account)->id; // null

optional() helper thật sự lí tưởng khi bạn sử dụng một object không phải của mình hoặc gọi đến một dữ liệu lồng nhau trong Eloquent relationships mà nó có thể có hoặc không tồn tại.


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í