Jak vytvořit vlastní Helper

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.

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

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.

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:

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?

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