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);
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');
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 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.
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'
);