Jako první bych uvedl definici z oficiální Laravel dokumentace co je helper: "Laravel zahrnuje mnoho globálních pomocných PHP funkcí. Mnoho z těchto funkcí využívá framework samotný, nicméně je lze libovolně využívat ve vaší aplikaci podle vašich potřeb."

Obecně to tedy znamená, že helpery jsou v Laravel zabudované funkce, které můžete volat kdekoliv ve vaší aplikaci. A pokud framework neposkytuje to co zrovna potřebujete, můžete nakonec skončit u tvorby vlastní helper třídy.

Ačkoliv framework poskytuje řadu předpřiravených helperů, vždy existuje šance, že budete potřebovat si svůj vlastní vytvořit, takže nebudete muset stále dokola psát ten samý blok kódu na různých místech, a tím zlepšíte i udržovatelnost aplikace.

Laravel helpery

Jak už jsem psal, existuje mnoho helperů dostupné přímo v jádru frameworku Laravel. Ty jsou seskupené dohromady podle funkcionality, které poskytují. Zde je seznam skupin helperů.

Arrays (pole)

Helpery v této skupině poskytují funkcionalitu pro manipulaci s elementy pole. Více než často jste v situaci, kdy potřebujete vykonat určitou operaci s elementy pole. Tato skupina je tedy první místo, které by jste měli vyhledat, jestli již nějaký helper s potřebnou funkcí neexistuje.

Paths (cesty)

Funkce vrací celé cesty k různým adresářům jako je app, storage, config apod.

Strings (řetězce)

Manipulace s řetězci je něco, co využíváte každý den při vývoji aplikace. Ačkoliv existuje již řada funkcí, které poskytuje PHP samotné, v této sekci najdete další, které by se vám mohly hodit.

URL

V této kategorii moc helperů nenajdete, nicméně jsou užitečné skrze celou aplikaci. Využívají se pro generování cest, assetů či URL akcí při odeslání formuláře.

Miscellaneous (ostatní)

Tato kategorie obsahuje helpery, které poskytují různé funkcionality od logování po debugování a mnoho dalšího.

Pro kompletní seznam všech Laravel helperů pak není nic lepšího, než oficiální dokumentace.

Vytvoření nového helperu

Nyní máte základní povědomí o významu Laravel helperů a k čemu slouží. V této sekci půjdeme dál a demonstrujeme jak můžete vytvořit vlastní helper, který může být použit globálně ve vaší Laravel aplikaci.

Abychom uchovali věci jednoduché a nic nekomplikovali, vytvoříme velmi jednoduchý helper, který vezme parametr userid a jako odpověď vrátí jméno uživatele. Chápu, že to moc zajímavě nezní, nicméně věřím, že to k demonstraci základního konceptu stačí. Funkci si pak můžete sami libovolně rozšířit o komplexní požadavky.

Kostra helperu

Dříve než se pustíme do tvorby, udělám rychlou prohlídku souborů, které vytvoříme nebo upravíme v průběhu článku.
  • `app/Helpers/User.php` : Soubor, který obsahuje logiku našeho helperu
  • `app/Providers/UserServiceProvider.php` : Vlastní service provider, který načte náš helper soubor
  • `config/app.php` : V tomto souboru deklarujeme náš service provider a také nám umožní definovat alias k helperu, takže pro jeho použití nebudeme muset psát celou cestu ke třídě.
  • `routes/web.php` : Standardní Laravel cesta, na které budeme testovat helper.

Vytvoření helper souborů

Ačkoliv helper soubory můžete vytvořit kdekoliv v aplikaci, je více intuitivní a standardní je vytvářet v adresáři `app`.

Jako první vytvoříme adresář Helpers (v adresáři app) a v něm třídu User.php s následujícím obsahem. Třídu samozřejmě můžete vytvořit přímo v adresáři app, avšak vytvoření další úrovně nám pomůže při organizování dalších helperů.

//app/Helpers/User.php
namespace App\Helpers;
 
use Illuminate\Support\Facades\DB;
 
class User {
    /**
     * @param int $user_id User-id
     * 
     * @return string
     */
    public static function getUsername($user_id) {
        $user = DB::table('users')->where('userid', $user_id)->first();
         
        return (isset($user->username) ? $user->username : '');
    }
}

Soubor začíná s klasickým definování namespace:

namespace App\Helpers;

Účel našeho helperu je získat jméno uživatele na základě jeho ID, respektive userid. Tím pádem potřebujeme interakci s databází a to zahrnuje DB fasádu.

use Illuminate\Support\Facades\DB;

Pro ty, kteří nejsou seznámeni s Laravel fasádami, jedná se jen o další pohodlný přístup k objektům v service kontejnerech. Alternativou může být využití dependency injection.

Dále máme konkrétní implementaci našeho helperu. Jak můžete vidět, jedná se o statickou metodu, která definuje logiku pro získání jména uživatele na základě userid.

$user = DB::table('users')->where('userid', $user_id)->first();

Objekt $user obsahuje databázový záznam s odpovídajícím userid. Nakonec metoda vrací jméno uživatele jako odpověď v následujícím příkazu.

return (isset($user->username) ? $user->username : '');

Nyní máme vytvořenou naši helper třídu, avšak vyvstává otázka jak ho použít? Na výběr máme dvě možnosti:

  • Cestu k helper třídě můžeme vložit do `composer.json` a tím se bude automaticky načítat. Tímto způsobem pak můžeme přímou cestou volat statickou metodu našeho helperu.
  • Můžeme vytvořit Laravel service provider, který nám umožní registrovat náš helper soubor, takže framework ho načte spolu s dalšími závislostmi. Poté service provider zaregistrujeme v Laravel konfiguraci a vytvoříme alias pro použití helperu.

První způsob je samozřejmě rychlejší a jednoduší na implementaci, nicméně osobně doporučuji druhou možnost, jelikož se jedná o doporučený "artisan způsob" a je také více udržovatelný.

V příkazové řádce vykonejte následující příkaz (v kořenu aplikace) pro vytvoření nového service provideru.

$php artisan make:provider UserServiceProvider 
Provider created successfully.

Měli byste vidět zprávu, která potvrzuje, že třída byla úspěšně vytvořena v adresáři app/Providers.

Otevřete tuto třídu a měli byste vidět dvě vytvořené metody. V kontextu tohoto článku je pro nás důležitá metoda register. Ano, v tento okamžik je prázdná, takže jej naplňte obsahem, který je mnohem užitečnější.

public function register()
{
    require_once app_path() . '/Helpers/User.php';
}

Metoda register se používá pro registrování našich závislostí, a to jsme právě udělali - vložili jsme náš helper soubor.

Zde je jak by soubor app/Providers/UserServiceProvider.php měl vypadat po úpravě.

// app/Providers/UserServiceProvider.php
namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
 
class UserServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
 
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        require_once app_path() . '/Helpers/User.php';
    }
}

Dále potřebujeme informovat Laravel o našem service provideru aby ho mohl automaticky načíst během spouštění frameworku. Otevřete soubor config/app.php a přidejte do pole providers na konec následující element.

App\Providers\UserServiceProvider::class,

Abychom mohli helper používat jednoduchým způsobem, vytvoříme pro něj také alias. Ve stejném souboru na konec pole aliases přidáme následující záznam.

'UserHelper' => App\Helpers\User::class,

Definováním tohoto záznamu můžeme náš helper volat klíčovým slovem UserHelper. Celkem jednoduché a pohodlné ne?

Helper v akci

Opět, abychom věci nechali jednoduché a přímočaré, definujeme základní Laravel cestu a zavoláme hned náš nově vytvořený helper.

Otevřete (případně vytvořte pokud ještě neexistuje) soubor routes/web.php a přidejte následující blok s kódem.

// routes/web.php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
 
Route::get('/user-helper-demo', function () {
    return UserHelper::getUsername(13);
});

Myslím, že zde není moc co vysvětlovat. Jen jsme zavolali náš helper příkazem UserHelper::getUsername a vrátilo se nám jméno uživatele. Helper samozřejmě můžeme volat kdekoliv v aplikaci, v controlleru či v pohledu.

Zdroj: tutsplus.com