Pohledy

Pohledy (views) obsahují HTML a separují aplikační logiku (controllery) od prezentační logiky. Pohledy defaultně najdete v resources/views a velmi jednoduchý pohled může vypadat takto:

<!-- Pohled je ulozeny v resources/views/greeting.blade.php -->

<html>
    <body>
        <h1>Hello, {{ $name }}</h1>
    </body>
</html>

Pohledy jsou šablony typu Blade, takže je možné do nich vkládat i speciální tagy, které nám umožňují lépe pracovat s daty. V předešlém případě jsme vykreslili proměnnou $name. Její definování můžeme provést rovnou v routě (případně v controlleru), kdy vracíme pohled pomocí globálního helperu view:

Route::get('/', function () {
    return view('greeting', ['name' => 'Patrik']);
});

Jak můžete vidět, první argument vložený do helperu view odpovídá názvu pohledu, uloženého v adresáři resources/views. Druhý argument je pole dat, které jsou pohledu k dispozici. V našem případě si předáváme proměnnou name, která je vykreslena pomocí Blade syntaxe.

Pokud bychom měli pohled zanořený hlouběji v adresáři, pak můžeme využít tzv. "tečkovací" notaci, kdy další úroveň oddělíme tečkou. Pokud bychom měli pohled například uložený v resources/views/admin/profile.blade.php, můžeme na něj odkázat takto:

return view('admin.profile', $data);

Vložení dat do pohledů

Jak jste mohli vidět v předešlém příkladě, data by měla být pole ve formátu klíč/hodnota. Alternativou namísto vkládání celého pole do helperu view může být použítí metody with pro přidání samostaných částí dat do pohledu:

return view('greeting')->with('name', 'Patrik');

Sdílení dat do všech pohledů

Občas narazíte na to, že potřebujete některé data vkládat do všech pohledů nebo je mít k dispozici pokaždé, když se zobrazí pohled. Typickým příkladem může být menu, které obsahuje některé proměnné. Menu se zobrazuje vždy, ať už je návštěvník kdekoliv v aplikaci. Abychom nemuseli stále dokola řešit vkládání potřebných dat do pohledu, můžeme využít metody share, která se nachází ve fasádě pohledu. Typicky se metoda share volá v service provideru, konkrétně v metodě boot. To je proto, že service providery se vždy vykonají dříve, než dojde k samotnému vykreslení pohledu. Metoda boot tak zajístí, že se do pohledu vždy dostanou data, které potřebujeme:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('name', 'Patrik');
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

V tomto případě jsme využili AppServiceProvider, nicméně můžete si vytvořit vlastní service provider, který bude zodpovídat pouze za předávání dat do pohledů.

View Composers

View Composers jsou callbacky nebo metody tříd, které jsou zavolány v okamžiku, kdy se vykreslují pohledy. Pokud máte data která chcete v pohledu zobrazit pokaždé, kdy je pohled vykreslen, view composer vám pomůže oddělit logiku do samostatné třídy.

Mějme příklad, kdy si vytvoříme nový service provider, který bude zodpovídat za vykreslení dat v pohledech. K tomu využijeme fasádu View a metodu composer. Laravel neobsahuje žádný výchozí adresář pro view composery, takže si ho můžete vytvořit prakticky kdekoliv. Strukturu si vytvoříme třeba takto app/Http/View/Composers:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        View::composer(
            'profile', 'App\Http\View\Composers\ProfileComposer'
        );

        // Using Closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Díky tomu, že jsme zaregistrovali composer ProfileComposer, kdykoliv se bude vykreslovat pohled profile, zavolá se metoda compose. Definujeme si tedy tuto třídu:

<?php

namespace App\Http\View\Composers;

use Illuminate\View\View;
use App\Repositories\UserRepository;

class ProfileComposer
{
    /**
     * Repositar s uzivateli
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        // Zavislosti za nas automaticky resi service container...
        $this->users = $users;
    }

    /**
     * Navazeme data na pohled
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('count', $this->users->count());
    }
}

Ještě než se pohled vykreslí, zavolá se metoda composer, která v parametru přebírá instanci Illuminate\View\View právě se vykreslujícího pohledu. Využijeme metody with a data vložíme do pohledu.

Využití composeru ve více pohledech

View composer můžete naráz přiřadit k více pohledům, kdy do prvního parametru metody composer vložíte pole pohledů:

View::composer(
    ['profile', 'dashboard'],
    'App\Http\View\Composers\MyViewComposer'
);