4 metody pro lehčí práci

V Laravelu existuje opravdu hodně pomocných metod, díky kterým je vývoj mnohem efektivnější. Určitě doporučuji shlédnout oficiální dokumentaci, kde najdete mnoho metod, které denně využijete při vývoji. V tomto článku prakticky ukážu čtyři metody, které často a rád používám.

Arr::get()

Helper Arr::get() vám umožňuje získat hodnotu z pole nebo objektu pomocí tečkové notace. Nepovinný třetí parametr slouží k definování výchozí hodnoty, pokud klíč neexistuje:

use Illuminate\Support\Arr;

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

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

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

V dřívějších verzích Laravelu se namísto této metody používala metoda data_get(), která dělá úplně to samé jako Arr::get() a má i stejnou syntaxi. Nicméně v této starší metodě (v Laravelu 8 stále funkční) lze využít i "wildcard":

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

//
[
  0 => [
    "count" => 75
  ]
  1 => [
    "count" => 12
  ]
]

Tento helper oceníte především v okamžiku, kdy potřebujete najít elementy v poli nebo objektu a nemusíte kontrolovat, o jaký typ proměnné se jedná - metoda má vždy stejnou syntaxi.

tap()

Metoda tap() přijímá dva argumenty, hodnotu a closure. Hodnota je předána do closure a stejná hodnota je pak vrácena zpátky:

$product = Product::find(1);

return tap($product, function ($product) {
    $product->update([
        'price' =>  '200'
    ]);
});

V tomto případě je vrácen $product model namísto booleanu, který vrací update. Na tuto funkci můžete také zřetězit jakoukoliv jinou metodu. Návratová hodnota pak bude vždy stejná, nezávisle na tom, co v této metodě provádíte:

$product = Product::find(1);

return tap($product)->update([
    'price' =>  '200'
]);

Opět v tomto příkladu bude vrácen model s produktem namísto booleanu.

abort_if()

Helper abort_if() vyhazuje výjimku pokud je daná podmínka vyhodnocena jako true. Nepovinný třetí parametr obsahuje vlastní text odpovědi a čtvrtý, taktéž nepovinný, obsahuje pole hlaviček:

abort_if(! Auth::user()->isAdmin(), 403);
abort_if(! Auth::user()->isAdmin(), 403, 'Sorry jako, nejste admin');
abort_if(Auth::user()->isCustomer(), 403);

Mnoho z nás určitě již napsalo nebo vidělo něco podobného jako na příkladu. Pomocí metody abort_if() to můžeme zkrátit na jediný řádek:

// v controlleru
public function index()
{
    if (! Auth::user()->isAdmin()) {
        abort(403, 'Sorry jako, nejste admin');
    }
}

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

Jen poznámka, pokud potřebujete přístupy kontrolovat více globálně, třeba už při vstupu na routu, doporučuji logiku přenechat autorizační bráně nebo ji přemístit do middlewaru.

optional()

Asi nejvíce oceňovaná metoda je pro mě optional(), která umožňuje přístup k property nebo zavolat metodu na objektu. Problém samozřejmě ale vzniká, pokud je daný objekt null. V klasickým případě nám to vyhodí PHP chybu "Trying to get property of non-object". Tomu se dá ale zabránit právě metodou optional(), která namísto chyby vrací null:

// User 1 existuje s profilem
$user1 = User::find(1);
$accountId = $user1->profile->id; // 123

// User 2 existuje, ale bez profilu
$user2 = User::find(2);
$accountId = $user2->profile->id; // PHP Error: Trying to get property of non-object

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

// Fix s optional()
$accountId = optional($user2->profile)->id; // null