/ laravel

5 Laravel хелперов, которые сделают вашу жизнь легче

Laravel имеет достаточное количество хелперов, упрощающих повседневную жизнь программиста. Если вы достаточно давно программируете на Laravel, то можете заметить, как хелперы фреймворка делают работу программиста более эффективной и удобной.
На самом деле, функций-хелперов существует достаточно много, но, сегодня, я рассмотрю мои самые любимые. Что же, хватит тратить впустую слова, рассмотрим же эти Laravel хелперы.

data_get()

Этот хелпер из категории laravel array helpers.
Хелпер data_get() позволяет получить из массива/объекта данные по ключу, в уже, привычном формате - разделения ключей через точку, как при вызове представлений view('admin.users.index').

Рассмотрим на примере исходного массива:

$data = [
    'users' => [
        ['name' => 'Alex', 'iq' => 100500],
        ['name' => 'Dmitry','iq' => 99]
    ]
];

Хелпер data_get($data, $key) принимает 2 основных аргумента, где
data - это исходный массив, или объект,
key - ключ, по которому мы хотим получить данные.

И, желая получить имя первого пользователя (из массива выше), можно обратить так, явно указывая индекс элеманта массива:
data_get($data, 'users.0.name'); //Alex

Или, чтобы получить поле iq всех пользователей: data_get($data, 'users.*.iq'), результатом чего будет массив из чисел:
Array
(
[0] => 100500
[1] => 99
)

Ничто не мешает делать более сложные конструкции, с более сложными вложенностями.

* - означает получение всего массива, всех элементов

Аналогично работаем и с объектами:

$company = Company::with('reviews')->findOrFail(1);
data_get($company, 'reviews.*.review'); //Array ( [0] => All is good:) [1] => All is good:) [2] => All is good:) )

Так же, важно знать, что эта функция принимает и 3 аргумент, который указывает значение по умолчанию, если ничего не было найдено:
data_get($data, 'users.0.name', 'undefined');

Хелпер data_get() позволяет не задумываться о типе исходных данных (массив это, или объект), и позволяет, с помощью "синтаксического сахара" переложить ответственность за проверку типов, поиск значений и обработку ошибок на сам фреймворк.

str_plural()

Это хелпер, который позволяет конвертировать строку в множественное число. Этот хелпер помогает определить правильное окончание для слова, в зависимости от численности его сущности. По общей задумке, этот хелпер должен автоматически определять окончание для слова: apple: 1 apple, 2 apples...

Функция str_plural($value, $count = 2) принимает два аргумента,
где $value - это число, которое нужно склонять, в зависимости от его количества
$count - это численность, которая указывает на множествоственность числа.

Теперь, проверим работу на примере слова "apple":

echo str_plural('apple', 2); //apples
echo str_plural('apple', 1); //apple

Как можно увидеть, из сигнатуры хелпера - второй аргумент необязательный. Потому, при обычном вызове функции с одним аргументом, всегда будем получать множественное число (на что и указывает имя это функции plural - множественное число ):
echo str_plural('apple'); //apples

Противоположной по результату функцией является str_singular(), которая множественное число переводит в единичное: str_singular('apples'); //apple

В даный момент поддерживается только английская локализация.

route()

Этот laravel URL хелпер генерирующий адрес по имени маршрута.
При генерации адреса по имени маршрутов, изменяя их паттерны, не придётся прописывать URL-адреса в коде заново, так как они будут привязаны только к их именам.

Рассмотрим на примере маршрутов:

Route::get('users')->name('users');
Route::get('user/{id}')->name('user');

Функция route() принимает 3 аргумента route($name, $parameters = [], $absolute = true)

Зная это, создать ссылку по имени маршрута будет просто:

route('users'); // http://localhost/users
route('user', 1); // http://localhost/user/1
route('user', ['id' => 1]); // http://localhost/user/1
route('user', User::find(1); // http://localhost/user/1
route('user', ['id' => 1, 'like' => 1]); // http://localhost/user/1?like=1

Можно заметить, что этот хелпер универсальный: принимает параметры в виде примитивного значения, массива, или даже объекта. И, благодаря этому, вторым аргументов можно передавать не только идентификаторы маршрута {id}, но и дополнительные параметры, которыми URL-адрес будет дополнен.

И последний, третий аргумент - генерация абсолютного пути. Если передать false, то пути будут абсолютными, и будут иметь вид: /user/1

В случае, если в хелпер вторым аргументом передаётся eloquent-объект, то фреймворк так же распознает его и сгенерирует корректный URL. По умолчанию, в свой маршрут он будет подставлять id (PRIMARY KEY), однако, можно переопределить это в самой моделе, добавив метод, в котором указать имя поля, по которому будет генерироваться маршрут

public function getRouteKeyName()
{
    return 'alias';
}

И URL будет всё так же просто:
route('user', User::find(1)); // http://localhost/user/username

abort_if()

В фреймворке уже есть похожий хелпер abort(), который выбрасывает исключения HttpException. Функция принимает 2 основных аргумента abort($code, $message = ''), где
$code - http-код ответа,
$message - отображаемое сообщение.

И, при программировании на laravel, часто приходится пользоваться конструкциями, похожими на эту:

if(!$user->isAdmin()) {
    abort(403, 'А ты точно админ?');
    //или abort(403);
}

Приятно, что Laravel разработчики позаботились и о такой мелочи, и создали обёртку над функцией abort(), что упрощает до:

abort_if(!$user->isAdmin(), 403, 'А ты точно админ?');

И, аналогично хелперу abort, abort_if первым аргументом принимает условие, при котором будет выброшено исключение.

abort_if(true, 404); // выбросит исключение
abort_if(false, 404); // никогда не произойдёт

optional()

Этот хелпер позволяет получить доступ к свойствам или методам переданного объекта. Хелпер optional() позволяет вызвать любые свойства объекта, игнорируя ошибки, даже, если вместо объекта передать null.

$advert = Advert::find(1);
$advert_parent = $advert->parent; 

$parent = optional($advert_parent)->name;
// вместо
$parent = $advert->parent ? $advert->parent->name : null;

Выполняя вызов optional($advert_parent)->name, кажется, что, если, переменная $advert_parent будет null, получим ошибку при попытке получения свойства. Однако, внутри, эта функция проводит большую работу, которая позволяет выполнять подобные вызовы, не задумываясь о содержимом переменной.

Эта функция - идеальный помощник при вызове вложенностей данных в объектах, в, особенности, связанных в Eloquent, когда результат связанных данных не всегда очевиден.

Резюме

В этой статье я показал 5 основных хелперов Laravel, которыми пользуюсь каждый день, и которые здорово облегчают жизнь. Однако, это лишь малая часть того, что фреймворк предоставляет.
Рекомендую ознакомиться со всеми доступными встроенными хелперами, а так же, активно пользоваться и внедрять их в разработку.
Теперь, освоив эти хелперы, уверен, что ваша жизнь стала немного легче :).