Laravel-tips del 3 – View composers

Ofta när man programmerar en applikation så stöter man förr eller senare på problemet att man har en variabel som man vill ska vara tillgänglig i alla vyer, eller kanske rentutav alla vyer som använder en särskild layout – något som man i Laravel inte löser särskilt bra med det vanliga hederliga with() i controllern, då variabeln endast blir tillgänglig i den aktuella vyn.

public function getIndex() {
    return View::make('public.frontpage')
           ->with('title', 'startsida')
}

Man kan även så klart använda View::share(), som kommer att sätta variabeln i alla vyer (kanske genom att lägga till dem i BaseController?). Eller som somliga rekommenderar; att använda Laravels IoC-container för att sätta upp kod som kan registrera och "dela" på variabler.

Men, nu handlar det här om view composers.

View composers är en intressant och användbar funktion i Laravel som man kanske inte används jätteofta, trots att de kan vara otroligt användbart för att just sätta variabler i utvalda vyer.

Det enklaste sättet att använda en view composer är:

View::composer(array('*'), function($view) {
    $view->with('foo', 'bar');
});

Den här koden lägger man enklast in i en fil som alltid inkluderas (tips: skapa viewcomposers.php och dra med den i autoload-classmap i composer.json – eller kanske filters.php).

Det fina här är att du kan välja vyn (eller vyerna) som variabeln ska vara tillgänglig i, du behöver inte fundera på vilka routes eller vilken controller som ska använda dem.

Detta är enormt användbart om man är längre fram i utvecklingen av en applikation och man kommer på att man alltid behöver en variabel definerad, för att slippa skriva kod som:

@if(isset($foo) && $foo == 'bar')
    <p>Ett litet meddelande</p>
@endif

Men, tillbaka till fler exempel med composers. I exemplet ovan använder vi en asterisk, *, för att visa att variabeln ska vara tillgänglig för alla vyer. Man man kan på likadant vis ange specifika vyer:

View::composer(array('public.frontpage', 'public.login'), function($view) {
    $view->with('foo', 'bar');
});

Eller om man så önskar, en layout:

View::composer(array('layouts.main'), function($view) {
    $view->with('foo', 'bar');
});

Det blir ett litet annorlunda tänk, då man faktiskt jobbar med namnen på vy/blade-filerna istället för routes eller controllers som man vanligtvis gör i Laravel. Spana in dokumentationen för att läsa mer.