5 個讓你的開發更加輕鬆的輔助函式

Epona發表於2018-02-23

本文為翻譯文章,原文章地址: 5 Laravel Helpers to Make Your Life Easier

在Laravel框架中有許多的輔助函式來幫助開發者更加有效率的進行開發。在這篇文章中,我會列出我個人比較喜歡的5個輔助函式

data_get()

data_get()輔助方法能夠讓你使用[.]符號來獲取陣列或者物件中的值。'array_get()'方法也是同樣的道理。如果陣列或者物件的key不存在的話,這個方法第三個可選引數可以設定一個預設值。

$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

如果在點符號連線中使用萬用字元'*'將會返回一個陣列。

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

'data_get()'輔助方法能夠讓你輕鬆的再陣列或者物件中使用相同的語法來查詢資料。這樣你就不必檢查你之前使用的變數是什麼型別了。

str_plural()

'str_plural()'是將字串變成對應的複數形式,目前只對英文的單詞有效,第二個可選的引數能夠讓開發者來自己決定返回單數還是複數形式。

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

這個輔助方法最主要的用處就是能夠移除類似 {{ $count == 1 ? 'dog' : 'dogs' }} 這樣的程式碼。與之相反的還有一個'str_singular()'的輔助方法。 如果你感興趣這個方法的工作原理,那麼可以看看 Doctrine’s Inflector Class

route()

'route()'方法能夠生成已經命名的路由,可選的第二個引數將會傳遞給路由的引數。

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

如果將第三個可選引數設為false的話,那麼將會返回一個相對地址而不是一個絕對地址

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

設定了子域名的也是同樣的道理, 並且你也可以將Eloquent模型傳參給route()方法

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']); 

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

abort_if()

這個輔助方法將會丟擲一個異常如果符合滿足的要求。第三個可選引數為丟擲異常的訊息,第四個為header陣列。

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

這個方法最主要的用處就是精簡類似下面的程式碼,通過使用 abort_if() 能夠只用一行程式碼實現同樣的功能。

// 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);
}

注意 如果你是通過這個來控制許可權的話,你應該瞭解一下 authorization gates。 這樣你就可以省去很多的abort檢查了。

optional()

這個方法允許你來獲取物件的屬性或者呼叫方法。如果該物件為null,那麼屬性或者方法也會返回null而不是引起一個錯誤

// 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

那麼,你們最喜歡的輔助函式是哪些呢?

本作品採用《CC 協議》,轉載必須註明作者和本文連結

There's nothing wrong with having a little fun.

相關文章