Tytuł oryginału: Application Development Cookbook

Tłumaczenie: Mirosław Gołda

ISBN: 978-83-283-0302-7

Copyright © Packt Publishing 2013.

First published in the English language under the title: „Laravel Application Development Cookbook”.

Polish edition copyright © 2015 by Helion S.A. All rights reserved.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher.

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.

Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: [email protected] WWW: http://helion.pl (księgarnia internetowa, katalog książek)

Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/larare Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Printed in Poland.

• Kup książkę • Księgarnia internetowa • Poleć książkę • Lubię to! » Nasza społeczność • Oceń książkę Spis treĂci

O autorze 7 O recenzentach 8 WstÚp 9

Rozdziaï 1. Instalowanie Laravela 13 Wprowadzenie 13 Instalowanie Laravela w postaci moduïu zaleĝnego repozytorium git 14 Konfigurowanie hostów wirtualnych i Ărodowiska deweloperskiego na serwerze Apache 15 Tworzenie „czystych” adresów URL 17 Konfigurowanie Laravela 18 Praca z Laravelem w edytorze Sublime Text 2 19 Konfigurowanie Ărodowiska IDE pozwalajÈce wïÈczyÊ autouzupeïnianie przestrzeni nazw dla Laravela 21 Wykorzystywanie mechanizmu autoloadera do mapowania pomiÚdzy nazwÈ klasy a plikiem z jej definicjÈ 24 Tworzenie zaawansowanych autoloaderów z przestrzeniami nazw i katalogami 25

Rozdziaï 2. Pobieranie danych wejĂciowych 29 Wprowadzenie 29 Tworzenie prostego formularza 30 Pobieranie danych z formularza i wyĂwietlenie ich na innej stronie 31 Walidacja danych wysïanych przez uĝytkownika 33 Tworzenie mechanizmu przesyïania plików 35 Walidacja przesyïanych plików 37 Tworzenie wïasnego komunikatu o bïÚdzie 39 Dodawanie „wabika” do formularza 42 Przesyïanie obrazów za pomocÈ biblioteki Redactor 44 Przycinanie obrazu za pomocÈ biblioteki Jcrop 47 Tworzenie pola tekstowego z autouzupeïnianiem 50 Tworzenie mechanizmu przechwytywania spamu w stylu CAPTCHA 53

Kup książkę Poleć książkę Spis treĞci

Rozdziaï 3. Uwierzytelnianie w Twojej aplikacji 57 Wprowadzenie 57 Instalowanie i konfigurowanie biblioteki Auth 58 Tworzenie systemu uwierzytelniania 60 Pobieranie i aktualizowanie danych o uĝytkowniku po zalogowaniu 64 Ograniczanie dostÚpu do wybranych stron 67 Konfigurowanie uwierzytelniania OAuth z uĝyciem pakietu HybridAuth 69 Wykorzystywanie OpenID do logowania 70 Logowanie z poĂwiadczeniami Facebooka 72 Logowanie z poĂwiadczeniami Twittera 74 Logowanie z poĂwiadczeniami LinkedIn 76

Rozdziaï 4. Przechowywanie i wykorzystywanie danych 79 Wprowadzenie 80 Tworzenie tabel w bazie danych z zastosowaniem migracji i schematów 80 Tworzenie zapytañ w jÚzyku SQL 83 Tworzenie zapytañ z uĝyciem konstruktora Fluent 85 Tworzenie zapytañ z wykorzystaniem systemu ORM Eloquent 88 Automatyczna walidacja w modelach 90 Relacje i zaawansowane funkcje systemu Eloquent 93 Tworzenie systemu CRUD 95 Importowanie plików CSV za pomocÈ systemu Eloquent 99 Kanaïy RSS jako ěródïa danych 101 Atrybuty do zmiany nazw kolumn w tabeli 102 ZastÈpienie systemu Eloquent innym systemem ORM 105

Rozdziaï 5. Wykorzystywanie kontrolerów i routingu do obsïugi adresów URL i tworzenia API 109 Wprowadzenie 110 Tworzenie prostych kontrolerów 110 Tworzenie routingu z wykorzystaniem domkniÚcia 111 Tworzenie kontrolera REST-owego 112 Zaawansowane opcje routingu 113 Filtry w routingu 115 Grupy reguï routingu 116 Tworzenie REST-owego API z wykorzystaniem routingu 118 Nazwany routing 124 Nazwa subdomeny w routingu 125

Rozdziaï 6. WyĂwietlanie widoków 129 Wprowadzenie 129 Tworzenie i wykorzystywanie prostego widoku 130 Przekazywanie danych do widoku 131 Wczytywanie widoku do innego (zagnieĝdĝonego) widoku 133 Dodawanie zasobów 136

4 Kup książkę Poleć książkę Spis treĞci

Tworzenie widoków z zastosowaniem systemu szablonów Blade 138 System szablonów Twig 140 Zaawansowane moĝliwoĂci systemu Blade 142 Tworzenie zlokalizowanej zawartoĂci 145 Tworzenie menu w Laravelu 148 Integracja z Bootstrapem 151 Nazwane widoki i kompozytory widoków 153

Rozdziaï 7. Tworzenie i wykorzystywanie pakietów Composera 157 Wprowadzenie 157 Pobieranie i instalowanie pakietów 158 Pakiet Generators do tworzenia szkieletu aplikacji 161 Tworzenie pakietu Composera w Laravelu 165 Dodawanie pakietów Composera do Packagista 169 Dodawanie pakietu spoza Packagista do Composera 171 Tworzenie wïasnego polecenia dla Artisana 173

Rozdziaï 8. Ajax i jQuery 177 Wprowadzenie 177 Pobieranie danych z innej strony 178 Konfigurowanie kontrolera tak, aby zwracaï dane w formacie JSON 181 Tworzenie funkcji wyszukiwania z wykorzystaniem techniki Ajax 183 Tworzenie i walidowanie uĝytkownika z wykorzystaniem techniki Ajax 185 Filtrowanie danych na podstawie pól wyboru 188 Tworzenie okna rejestracji do newslettera z uĝyciem techniki Ajax 191 Wysyïanie wiadomoĂci e-mail z zastosowaniem Laravela i biblioteki jQuery 194 Tworzenie tabeli z moĝliwoĂciÈ sortowania przy uĝyciu Laravela i biblioteki jQuery 197

Rozdziaï 9. Efektywne wykorzystywanie mechanizmów bezpieczeñstwa i sesji 201 Wprowadzenie 201 Szyfrowanie i odszyfrowywanie danych 202 Hashowanie haseï i innych danych 205 Tokeny CSRF i filtry w formularzach 208 Zaawansowana walidacja w formularzach 210 Tworzenie koszyka zakupowego 213 Wykorzystywanie Redisa do przechowywania sesji 216 Podstawowe zastosowanie sesji i ciasteczek 218 Tworzenie bezpiecznego serwera API 221

Rozdziaï 10. Testowanie i debugowanie aplikacji 225 Wprowadzenie 225 Instalowanie i konfigurowanie biblioteki PHPUnit 226 Tworzenie i uruchamianie testów 227 Wykorzystywanie biblioteki Mockery do testowania kontrolerów 228 Pisanie testów akceptacyjnych z uĝyciem biblioteki Codeception 231 Debugowanie i profilowanie aplikacji 233

5 Kup książkę Poleć książkę Spis treĞci

Rozdziaï 11. Wdraĝanie i integrowanie aplikacji z usïugami firm trzecich 237 Wprowadzenie 237 Tworzenie kolejek i wykorzystywanie Artisana do ich uruchamiania 238 Wdraĝanie aplikacji Laravela na platformÚ Pagoda Box 240 Uĝywanie bramki pïatnoĂci Stripe z frameworkiem Laravel 244 Przeszukiwanie bazy GeoIP i konfiguracja wïasnego routingu 247 Gromadzenie adresów e-mail i ich wykorzystywanie w usïugach pocztowych firm trzecich 248 Przechowywanie i pobieranie zawartoĂci zapisanej w chmurze Amazon S3 251

Skorowidz 255

6 Kup książkę Poleć książkę 6

WyĂwietlanie widoków

W tym rozdziale omówimy: Q Tworzenie i wykorzystywanie prostego widoku Q Przekazywanie danych do widoków Q Wczytywanie widoku do innego (zagnieĝdĝonego) widoku Q Dodawanie zasobów Q Tworzenie widoków z zastosowaniem systemu szablonów Blade Q System szablonów Twig Q Zaawansowane moĝliwoĂci systemu Blade Q Tworzenie zlokalizowanej treĂci Q Tworzenie menu w Laravelu Q Integracja z Bootstrapem Q Nazwane widoki i kompozytory widoków

Wprowadzenie Zgodnie ze wzorcem Model-View-Controller widoki przechowujÈ caïy kod HTML strony wraz ze stylami i wykorzystywane sÈ do wyĂwietlania przekazanych danych. W Laravelu wi- dokami mogÈ byÊ zwykïe pliki PHP lub pliki systemu szablonów frameworka Laravel, systemu Blade. Laravel jest równoczeĂnie na tyle rozszerzalny, ĝe umoĝliwia stosowanie dowolnego wybranego systemu szablonów.

Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

Tworzenie i wykorzystywanie prostego widoku W tej recepturze poznamy podstawowe funkcjonalnoĂci widoków i sposoby zaïÈczania widoków w aplikacji.

Przygotowanie BÚdziemy bazowaÊ na standardowej instalacji Laravela.

Jak to zrobiÊ… PostÚpuj zgodnie z poniĝszymi wskazówkami, aby wykonaÊ wszystkie kroki receptury: 1. W katalogu app/views utwórz folder myviews. 2. W katalogu myviews utwórz dwa pliki: home. oraz second.php. 3. Otwórz plik home.php i wprowadě nastÚpujÈcy kod HTML: Strona domowa

Witamy na stronie domowej!

Przejdě na drugÈ stronÚ

4. Otwórz plik second.php i wprowadě nastÚpujÈcy kod HTML: Druga strona

Witamy na drugiej stronie

Przejdě na stronÚ domowÈ

130 Kup książkę Poleć książkę Rozdziaá 6. • WyĞwietlanie widoków

5. W pliku app/routes.php dodaj routingi, które zwrócÈ oba widoki: Route::get('home', function() { return View::make('myviews.home'); }); Route::get('second', function() { return View::make('myviews.second'); }); 6. Sprawdě dziaïanie widoków, odwiedzajÈc adres http://{twój-serwer}/home (gdzie twój-serwer jest adresem URL serwera), a nastÚpnie kliknij ïÈcze.

Jak to dziaïa… Wszystkie widoki w Laravelu przechowywane sÈ w katalogu app/views. Rozpoczynamy od utworzenia dwóch plików, w których zamieszczamy kod HTML. W naszym przykïadzie two- rzymy statyczne strony, a kaĝdy utworzony widok przechowuje peïny kod HTML strony.

W pliku routingu zwracamy metodÚ View::make() z parametrem bÚdÈcym nazwÈ widoku. Ze wzglÚdu na fakt, ĝe pliki widoków znajdujÈ siÚ w podkatalogach katalogu widoków, wyko- rzystujemy notacjÚ kropkowÈ.

Przekazywanie danych do widoku W typowej aplikacji musimy wyĂwietlaÊ róĝnego rodzaju dane, pochodzÈce z bazy danych lub innego ěródïa. W Laravelu przekazywanie danych do widoków jest bardzo proste.

Przygotowanie W bieĝÈcej recepturze bazujemy na kodzie powstaïym po ukoñczeniu receptury „Tworzenie i wykorzystywanie prostego widoku”.

Jak to zrobiÊ… Aby wykonaÊ kroki tej receptury, postÚpuj zgodnie z poniĝszymi wskazówkami: 1. Otwórz plik routes.php i zastÈp kod strony domowej i drugiej strony nastÚpujÈcym kodem: Route::get('home', function() { $page_title = 'Tytuï strony domowej';

131 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

return View::make('myviews.home')->with('title', $page_title); }); Route::get('second', function() { $view = View::make('myviews.second'); $view->my_name = 'Jan Kowalski'; $view->my_city = 'Kraków'; return $view; }); 2. W katalogu views/myviews otwórz plik home.php i zastÈp jego zawartoĂÊ poniĝszym kodem: Strona domowa : <?= $title ?>

Witamy na stronie domowej!

Przejdě na drugÈ stronÚ

3. W katalogu views/myviews otwórz plik second.php i zastÈp jego zawartoĂÊ poniĝszym kodem: Druga strona

Witamy na drugiej stronie

Nazywasz siÚ i pochodzisz z miasta

Przejdě na stronÚ domowÈ

4. Sprawdě dziaïanie widoków, odwiedzajÈc adres http://{twój-serwer}/home (gdzie twój-serwer jest adresem URL serwera), a nastÚpnie kliknij ïÈcze.

132 Kup książkę Poleć książkę Rozdziaá 6. • WyĞwietlanie widoków

Jak to dziaïa… Laravel udostÚpnia kilka sposobów przekazywania danych do widoku. Rozpoczynamy od ak- tualizacji pierwszego routingu, tak aby wykorzystujÈc kaskadowe wywoïanie (ang. chaining) metody with() z metodÈ View::make(), przekazaÊ do widoku jednÈ zmiennÈ. NastÚpnie w pliku widoku moĝemy uĝywaÊ tej zmiennej za pomocÈ wybranej nazwy.

W nastÚpnym routingu przypisujemy wynik metody View::make() do zmiennej i przekazywa- ne wartoĂci do wïaĂciwoĂci obiektu. Teraz moĝemy w widoku stosowaÊ zmienne odpowiada- jÈce nazwom tych wïaĂciwoĂci. Aby wyĂwietliÊ widok, zwracamy po prostu zmiennÈ, do której przypisany jest obiekt.

To nie wszystko… Inna metoda przekazania danych do widoku przypomina sposób zaprezentowany w drugim routingu, ale z uĝyciem tablicy, a nie obiektu. Nasz kod mógïby wyglÈdaÊ podobnie jak wi- doczny poniĝej: $view = View::make('myviews.second'); $view['my_name'] = 'Jan Kowalski'; $view['my_city'] = 'Kraków'; return $view;

Wczytywanie widoku do innego (zagnieĝdĝonego) widoku Bardzo czÚsto strony internetowe majÈ jednolity ukïad i zbliĝonÈ do siebie strukturÚ kodu HTML. Moĝemy wyodrÚbniÊ powtarzajÈcy siÚ kod HTML za pomocÈ mechanizmu zagnieĝ- dĝonych widoków.

Przygotowanie Przed przystÈpieniem do tej receptury konieczne jest wykonanie czynnoĂci opisanych w re- cepturze „Tworzenie i wykorzystywanie prostego widoku”.

Jak to zrobiÊ… Aby wykonaÊ kroki tej receptury, postÚpuj zgodnie z poniĝszymi wskazówkami:

133 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

1. W katalogu app/view dodaj nowy folder o nazwie common. 2. W katalogu common utwórz plik header.php i wprowadě nastÚpujÈcy kod: Moja strona 3. W katalogu common utwórz plik footer.php i wprowadě nastÚpujÈcy kod:

© 2014 MojaFirma
4. W katalogu common utwórz plik userinfo.php i wprowadě nastÚpujÈcy kod:

Nazywasz siÚ i pochodzisz z miasta

5. W pliku routes.php zaktualizuj routingi strony gïównej i drugiej strony tak, aby korzystaïy z zagnieĝdĝonych widoków: Route::get('home', function() { return View::make('myviews.home') ->nest('header', 'common.header') ->nest('footer', 'common.footer'); }); Route::get('second', function() { $view = View::make('myviews.second'); $view->nest('header', 'common.header')->nest('footer', 'common.footer'); $view->nest('userinfo', 'common.userinfo', array('my_name' => 'Jan Kowalski', 'my_city' => 'Kraków')); return $view; }); 6. W katalogu views/myviews otwórz plik home.php i wprowadě nastÚpujÈcy kod:

Witamy na stronie domowej!

Przejdě na drugÈ stronÚ

134 Kup książkę Poleć książkę Rozdziaá 6. • WyĞwietlanie widoków

7. W katalogu views/myviews otwórz plik second.php i wprowadě nastÚpujÈcy kod:

Witamy na drugiej stronie

Przejdě na stronÚ domowÈ

8. Sprawdě dziaïanie widoków, odwiedzajÈc adres http://{twój-serwer}/home (gdzie twój-serwer jest adresem URL serwera), a nastÚpnie kliknij ïÈcze.

Jak to dziaïa… Na poczÈtek wydzielamy z naszych widoków kod nagïówka i stopki. Poniewaĝ na wszystkich stronach sÈ one takie same, tworzymy podkatalog w folderze views, w którym przechowywaÊ bÚdziemy te wspólne dla wszystkich plików widoki. Pierwszym plikiem jest nagïówek, który zawiera caïy kod HTML aĝ do tagu . Drugim plikiem jest stopka, która zawiera kod HTML znajdujÈcy siÚ na dole strony.

Trzecim plikiem jest widok userinfo zawierajÈcy informacje o uĝytkowniku. W aplikacjach, w których konta uĝytkowników posiadajÈ profile, potrzebujemy czÚsto zaïÈczyÊ dostÚpne infor- macje o uĝytkowniku w bocznej kolumnie lub w nagïówku. Aby przechowywaÊ ten plik w od- dzielnym widoku, tworzymy widok userinfo i wykorzystujemy przekazane do niego dane.

Do obsïugi routingu home stosujemy widok home, w którym zaïÈczamy nagïówek i stopkÚ. Pierwszym parametrem metody nest() jest nazwa, uĝywana w gïównym widoku, a drugim pa- rametrem jest lokalizacja widoku. W tym przykïadzie widoki zlokalizowane sÈ w niestandar- dowym podkatalogu, uĝywamy wiÚc notacji kropkowej, aby siÚ do nich odwoïaÊ.

W widoku strony gïównej wypisujemy nazwy zmiennych utworzone w routingu, aby wyĂwie- tliÊ zagnieĝdĝone widoki.

W drugim routingu oprócz nagïówka i stopki zaïÈczamy dodatkowo widok userinfo. W tym celu przekazujemy trzeci parametr do metody nest(), którym jest tablica danych przesïanych do widoku. NastÚpnie, gdy widok userinfo jest wïÈczany do gïównego widoku, zmienne zostajÈ do niego automatycznie przekazane „z góry”.

Zobacz takĝe Q Receptura „Przekazywanie danych do widoku”.

135 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

Dodawanie zasobów Aby dynamiczne strony internetowe mogïy dziaïaÊ, potrzebujÈ stylów CSS i skryptów Java- Script. Pakiet Asset frameworka Laravel umoĝliwia proste zarzÈdzanie tymi zasobami i zaïÈ- czanie ich w widoku.

Przygotowanie W tej recepturze bÚdziemy bazowaÊ na kodzie utworzonym w recepturze „Wczytywanie wi- doku do innego (zagnieĝdĝonego) widoku”.

Jak to zrobiÊ… Aby wykonaÊ kroki tej receptury, postÚpuj zgodnie z poniĝszymi wskazówkami: 1. Otwórz plik composer. i w sekcji require dodaj pakiet Asset w podany niĝej sposób: "require": { "laravel/framework": "4.0.*", "teepluss/asset": "dev-master" }, 2. W linii poleceñ zaktualizuj Composera, aby pobraÊ pakiet: php composer.phar update

3. Otwórz plik app/config/app.php file i dodaj ServiceProvider na koniec tablicy w sekcji providers: 'Teepluss\Asset\AssetServiceProvider', 4. W tym samym pliku w tablicy aliasów dodaj skróconÈ nazwÚ pakietu: 'Asset' => 'Teepluss\Asset\Facades\Asset' 5. W pliku app/filters.php dodaj wïasny filtr do zasobów: Route::filter('assets', function() { Asset::add('jqueryui', 'http://ajax.googleapis.com/ajax /libs/jqueryui/1.10.2/jquery-ui.min.js', 'jquery'); Asset::add('jquery', 'http://ajax.googleapis.com/ajax /libs/jquery/1.10.2/jquery.min.js'); Asset::add('bootstrap', 'http://netdna.bootstrapcdn.com /twitter-bootstrap/2.3.2/css/ bootstrap-combined.min.css'); });

136 Kup książkę Poleć książkę Rozdziaá 6. • WyĞwietlanie widoków

6. Zaktualizuj routingi strony gïównej i drugiej strony tak, aby korzystaïy z utworzonego filtra: Route::get('home', array('before' => 'assets', function() { return View::make('myviews.home') ->nest('header', 'common.header') ->nest('footer', 'common.footer'); })); Route::get('second', array('before' => 'assets', function() { $view = View::make('myviews.second'); $view->nest('header', 'common.header')->nest ('footer', 'common.footer'); $view->nest('userinfo', 'common.userinfo', array ('my_name' => 'Jan Kowalski', 'my_city' => 'Kraków')); return $view; })); 7. W katalogu views/common otwórz plik header.php i wprowadě nastÚpujÈcy kod: Moja strona 8. W katalogu views/common otwórz plik footer.php i wprowadě nastÚpujÈcy kod:

© 2014 MojaFirma
9. Sprawdě dziaïanie widoków, odwiedzajÈc adres http://{twój-serwer}/home (gdzie twój-serwer jest adresem URL serwera), kliknij ïÈcze i przejrzyj kod ěródïowy strony, aby zobaczyÊ, ĝe zasoby zostaïy zaïÈczone.

Jak to dziaïa… Pakiet Asset uïatwia dodawanie plików CSS i JavaScript do kodu HTML. Rozpoczynamy od „zarejestrowania” kaĝdego zasobu w routingu. Aby uproĂciÊ ten proces, dodajemy filtr as- sets, wykorzystywany przed wywoïaniem routingów. DziÚki temu kod odpowiedzialny za zaïÈczanie zasobów znajduje siÚ w jednym miejscu i ïatwo jest w nim wprowadzaÊ wymagane zmiany. W naszym przykïadzie dodajemy biblioteki jQuery, jQueryUI i plik CSS Bootstrapa z serwera CDN.

137 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

Pierwszym parametrem metody add() jest nazwa, którÈ nadajemy zasobowi. Drugim parame- trem jest adres URL zasobu. Moĝe nim byÊ Ăcieĝka wzglÚdna lub peïen adres URL. Trzecim, opcjonalnym parametrem jest zaleĝnoĂÊ zasobu. Do dziaïania biblioteki jQueryUI wymagane jest wczeĂniejsze wczytanie biblioteki jQuery, podajemy wiÚc jako trzeci parametr nazwÚ za- sobu jQuery.

NastÚpnie aktualizujemy routing i dodajemy filtr. JeĂli dodamy lub usuniemy jakiĂ zasób w filtrze, bÚdzie to automatycznie odzwierciedlone w kaĝdym routingu.

Korzystamy z zagnieĝdĝonych widoków, zasoby dodajemy wiÚc tylko do nagïówka i stopki. Pliki CSS wywoïywane sÈ przez metodÚ styles(), a pliki JavaScript przez metodÚ scripts(). Laravel sprawdza rozszerzenia plików zasobów i umieszcza je automatycznie we wïaĂciwym miejscu. Sprawdzenie kodu ěródïowego strony pozwala nam stwierdziÊ, ĝe Laravel zadbaï o to, aby skrypt jQuery znalazï siÚ przed skryptem jQueryUI, poniewaĝ w ten sposób ustawiliĂmy zaleĝnoĂci.

Zobacz takĝe Q Receptury „Filtry w routingu” w rozdziale 5., „Wykorzystywanie kontrolerów i routingu do obsïugi adresów URL i tworzenia API”

Tworzenie widoków z zastosowaniem systemu szablonów Blade W jÚzyku PHP przygotowano wiele systemów szablonów, a dostÚpny w Laravelu system Blade naleĝy do najlepszych. W tej recepturze pokaĝemy, jak w szybki sposób rozpoczÈÊ pracÚ z sys- temem szablonów Blade.

Przygotowanie W tej recepturze bÚdziemy bazowaÊ na standardowej instalacji Laravela.

Jak to zrobiÊ… Aby wykonaÊ kroki tej receptury, postÚpuj zgodnie z poniĝszymi wskazówkami: 1. W pliku routes.php utwórz nowy routing dla tworzonych stron: Route::get('blade-home', function() { return View::make('blade.home');

138 Kup książkę Poleć książkę Rozdziaá 6. • WyĞwietlanie widoków

}); Route::get('blade-second', function() { return View::make('blade.second'); }); 2. W katalogu views utwórz folder o nazwie layout. 3. W katalogu views/layout utwórz plik index.blade.php o nastÚpujÈcej zawartoĂci: Moja strona

@section('page_title') Witamy na @show

@yield('content') 4. W katalogu views utwórz folder blade. 5. W katalogu views/blade utwórz plik home.blade.php i wprowadě nastÚpujÈcy kod: @extends('layout.index')

@section('page_title') @parent Strona domowa utworzona z uĝyciem systemu Blade @endsection

@section('content')

Przejdě na {{ HTML::link('blade-second', 'drugÈ stronÚ.') }}

@endsection 6. W katalogu views/blade utwórz plik second.blade.php o nastÚpujÈcej zawartoĂci: @extends('layout.index')

@section('page_title') @parent Druga strona utworzona z uĝyciem systemu Blade @endsection

139 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

@section('content')

Przejdě na {{ HTML::link('blade-home', 'stronÚ gïównÈ.') }}

@endsection 7. Sprawdě dziaïanie widoków, odwiedzajÈc adres http://{twój-serwer}/blade-home (gdzie twój-serwer jest adresem URL serwera), i kliknij ïÈcze oraz wyĂwietl kod ěródïowy strony, aby zobaczyÊ, ĝe szablon Blade zostaï zaïÈczony.

Jak to dziaïa… Rozpoczynamy od utworzenia dwóch prostych routingów, które zwracajÈ widoki Blade. UĝywajÈc notacji kropkowej, ustawiamy lokalizacjÚ plików szablonów na podkatalog blade w folderze views.

NastÚpnym krokiem jest utworzenie pliku ukïadu strony w systemie Blade. Plik ten stanowi szkielet strony i znajduje siÚ w podkatalogu layout, w folderze views. Musimy mu nadaÊ roz- szerzenie blade.php. Widok jest prostym plikiem HTML z wyjÈtkiem obszarów @section() oraz @yield(). Ich zawartoĂÊ zostanie zamieniona lub dodana do widoków.

Widoki dla routingów rozpoczynamy od deklaracji ukïadu strony, z którego chcemy korzystaÊ. W naszym przypadku jest to wywoïanie @extends('layout.index'). NastÚpnie dodajemy lub zmieniamy zawartoĂÊ sekcji zadeklarowanych w ukïadzie. W sekcji page_title chcemy wy- ĂwietliÊ tekst zapisany w ukïadzie, ale uzupeïniony o dodatkowÈ treĂÊ. W tym celu wywoïujemy @parent jako pierwszy element w obszarze, a nastÚpnie dopisujemy poĝÈdanÈ zawartoĂÊ.

W obszarze @section('content') nie byï zadeklarowany ĝaden domyĂlny tekst, dodana zawar- toĂÊ bÚdzie wiÚc tworzyÊ caïÈ treĂÊ obszaru. System Blade pozwala nam równieĝ stosowaÊ na- wiasy {{ }} do zamieszczenia dowolnego kodu PHP. Uĝywamy metody Laravela HTML::link() do wyĂwietlenia ïÈcza. Teraz po przejĂciu na stronÚ caïa jej zawartoĂÊ znajdzie siÚ we wïaĂci- wym miejscu w strukturze ukïadu strony.

System szablonów Twig Chociaĝ praca z systemem szablonów Blade jest bardzo przyjemna, w niektórych przypad- kach musimy zastosowaÊ innÈ bibliotekÚ. Popularnym rozwiÈzaniem jest Twig. W bieĝÈcej recepturze pokaĝemy, jak wïÈczyÊ system szablonów Twig do aplikacji stworzonej w Laravelu.

Przygotowanie W tej recepturze wykorzystamy standardowÈ instalacjÚ Laravela.

140 Kup książkę Poleć książkę Rozdziaá 6. • WyĞwietlanie widoków

Jak to zrobiÊ… PostÚpuj zgodnie z poniĝszymi wskazówkami, aby wykonaÊ wszystkie kroki receptury: 1. Otwórz plik composer.json i w sekcji require dodaj nastÚpujÈce linie: "rcrowe/twigbridge": "0.6.*" 2. W linii poleceñ zaktualizuj Composera, aby zainstalowaÊ dodany pakiet: php composer.phar update

3. Otwórz plik app/config/app.php i na koñcu tablicy providers dodaj TwigServiceProvider: 'TwigBridge\ServiceProvider' 4. Aby utworzyÊ plik konfiguracyjny, w linii poleceñ wykonaj: php artisan config:publish rcrowe/twigbridge 5. W pliku routes.php utwórz nastÚpujÈcy routing: Route::get('twigview', function() { $link = HTML::link('http://laravel.com', 'strona Laravela.'); return View::make('twig')->with('link', $link); }); 6. W katalogu views utwórz plik twiglayout.twig i wprowadě nastÚpujÈcy kod: Moja strona

{% block page_title %} Witamy na {% endblock %}

{% block content %}{% endblock %} 7. W katalogu views utwórz plik twig.twig i wprowadě nastÚpujÈcy kod: {% extends "twiglayout.twig" %} {% block page_title %} {{ parent() }} Moja strona z utworzona uĝyciem systemu Twig

141 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

{% endblock %} {% block content %}

Przejdě na adres {{ link|raw }}

{% endblock %} 8. Sprawdě dziaïanie widoków, odwiedzajÈc adres http://twój-serwer/twigview (gdzie twój-serwer jest adresem URL serwera), i wyĂwietl ěródïo strony, aby zobaczyÊ, czy szablon Twig zostaï pomyĂlnie zaïÈczony.

Jak to dziaïa… Na poczÈtek instalujemy w naszej aplikacji pakiet TwigBranch. Pakiet ten instaluje równieĝ bibliotekÚ Twig. Po zainstalowaniu pakietu tworzymy za pomocÈ Artisana jego plik konfigura- cyjny i ustawiamy dostawcÚ usïugi.

W routingu wykorzystujemy takÈ samÈ skïadniÚ jak w dostÚpnej w Laravelu bibliotece widoków, a nastÚpnie wywoïujemy widok. Tworzymy równieĝ proste ïÈcze, zapisujemy je do zmiennej i przekazujemy tÚ zmiennÈ do widoku.

NastÚpnie tworzymy ukïad. Wszystkie pliki widoków w systemie Twig posiadajÈ rozszerzenie .twig, nadajemy wiÚc ukïadowi nazwÚ twiglayout.twig. WewnÈtrz ukïadu strony znajduje siÚ stan- dardowy kod HTML, dodatkowo dodajemy teĝ jednak dwa bloki Twig. W bloku page_title ustawiamy domyĂlnÈ zawartoĂÊ, podczas gdy blok content jest pusty.

Widok dla routingu rozpoczynamy od rozszerzenia ukïadu strony. Na poczÈtku bloku page_title wypisujemy domyĂlnÈ zawartoĂÊ za pomocÈ wyraĝenia {{ parent()}} i dodajemy wïasnÈ treĂÊ. NastÚpnie dodajemy blok content, a w jego wnÚtrzu wyĂwietlamy przekazane w postaci zmien- nej ïÈcze.

KorzystajÈc z systemu Twig, nie musimy podawaÊ znaku $ w nazwach zmiennych, a zmienne zawierajÈce kod HTML sÈ automatycznie „eskejpowane” (ang. escaping). Tak wiÚc, aby wy- ĂwietliÊ ïÈcze w naszym widoku, musimy pamiÚtaÊ o dodaniu parametru raw.

Teraz, gdy wejdziemy na stronÚ w oknie przeglÈdarki, zobaczymy caïÈ zawartoĂÊ we wïaĂci- wym miejscu.

Zaawansowane moĝliwoĂci systemu Blade DziÚki systemowi szablonów Blade mamy dostÚp do potÚĝnych funkcji, które zwiÚkszajÈ wy- dajnoĂÊ tworzenia aplikacji. W tej recepturze przekaĝemy dane do widoków Blade i wyĂwie- tlimy je w pÚtli, filtrujÈc je dodatkowo wedïug pewnych kryteriów.

142 Kup książkę Poleć książkę Rozdziaá 6. • WyĞwietlanie widoków

Przygotowanie W tej recepturze wykorzystamy kod utworzony w recepturze „Tworzenie widoków z zastoso- waniem systemu szablonów Blade”.

Jak to zrobiÊ… PostÚpuj zgodnie z poniĝszymi wskazówkami, aby wykonaÊ wszystkie kroki receptury: 1. Otwórz plik routes.php i zaktualizuj routingi blade-home oraz blade-second w nastÚpujÈcy sposób: Route::get('blade-home', function() { $movies = array( array('name' => 'Gwiezdne wojny', 'year' => '1977', 'slug' => 'star-wars'), array('name' => 'Matrix', 'year' => '1999', 'slug' => 'matrix'), array('name' => 'Szklana puïapka', 'year' => '1988', 'slug' => 'die-hard'), array('name' => 'Sprzedawcy', 'year' => '1994', 'slug' => 'clerks') ); return View::make('blade.home')->with('movies', $movies); }); Route::get('blade-second/(:any)', function($slug) { $movies = array( 'star-wars' => array('name' => 'Gwiezdne wojny', 'year' => '1977', 'genre' => 'Science-fiction'), 'matrix' => array('name' => 'Matrix', 'year' => '1999', 'genre' => 'Science-fiction'), 'die-hard' => array('name' => 'Szklana puïapka', 'year' => '1988', 'genre' => 'Sensacyjny'), 'clerks' => array('name' => 'Sprzedawcy', 'year' => '1994', 'genre' => 'Komedia') ); return View::make('blade.second')->with('movie' , $movies[$slug]); }); 2. W katalogu views/blade zaktualizuj plik home.blade.php i wprowadě poniĝszy kod: @extends('layout.index')

@section('page_title') @parent

143 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

Nasza lista filmów @endsection

@section('content')

    @foreach ($movies as $movie)
  • {{ HTML::link('blade-second/' . $movie['slug'], $movie['name']) }} ( {{ $movie['year'] }} )
  • @if ($movie['name'] == 'Szklana puïapka')
    • Gïówny charakter: John McClane
    @endif @endforeach
@endsection 3. W katalogu views/blade zaktualizuj plik second.blade.php i wprowadě poniĝszy kod: @extends('layout.index')

@section('page_title') @parent Strona filmu {{ $movie['name'] }} @endsection

@section('content') @include('blade.info')

Przejdě na {{ HTML::link('blade-home', 'stronÚ gïównÈ.') }}

@endsection 4. W katalogu views/blade utwórz plik info.blade.php o nastÚpujÈcej zawartoĂci:

{{ $movie['name'] }}

Rok: {{ $movie['year'] }}

Gatunek: {{ $movie['genre'] }}

5. Sprawdě dziaïanie widoków — odwiedě adres http://{twój-serwer}/blade-home (gdzie twój-serwer jest adresem URL serwera), a nastÚpnie kliknij ïÈcze.

Jak to dziaïa… W tej recepturze przekazujemy dane do widoków Blade i przechodzimy po nich w pÚtli, uwzglÚdniajÈc dodatkowe warunki. W rzeczywistych aplikacjach pobralibyĂmy dane z bazy, ale w naszym przykïadzie korzystamy z danych zapisanych w tablicy.

144 Kup książkę Poleć książkę Rozdziaá 6. • WyĞwietlanie widoków

Pierwszy routing zawiera tablicÚ filmów, a przekazane dane zawierajÈ rok i uproszczonÈ na- zwÚ (ang. slug), których moĝna uĝyÊ do przygotowania adresu URL. Drugi routing przyjmuje uproszczonÈ nazwÚ w adresie URL i tworzy tablicÚ, której kluczami sÈ uproszczone nazwy. NastÚpnie przekazujemy szczegóïy wybranego filmu do widoku, wykorzystujÈc do tego nazwÚ z adresu URL.

W pierwszym widoku tworzymy pÚtlÚ @foreach, aby wyĂwietliÊ w pÚtli dane zapisane w tablicy. UĝyliĂmy takĝe prostej instrukcji @if do wyĂwietlenia dodatkowych informacji o okreĂlo- nym filmie. W kaĝdym przebiegu pÚtli wyĂwietlamy ïÈcza do drugiego routingu uzupeïnione o uproszczonÈ nazwÚ.

W drugim widoku wyĂwietlamy nazwÚ filmu, ale dodatkowo w bloku content zaïÈczamy inny widok Blade za pomocÈ instrukcji @include(). DziÚki temu wszystkie dane, które sÈ widoczne w gïównym widoku, sÈ równieĝ widoczne w widoku zaïÈczonym. W widoku info moĝemy zatem uĝyÊ wszystkich zmiennych ustawionych w routingu.

Tworzenie zlokalizowanej zawartoĂci JeĂli z naszej aplikacji majÈ korzystaÊ osoby z innych krajów i mówiÈce w innych jÚzykach, musi- my im udostÚpniaÊ zlokalizowane treĂci. Laravel pozwala w prosty sposób wykonaÊ to zadanie.

Przygotowanie W bieĝÈcej recepturze bÚdziemy bazowaÊ na standardowej instalacji Laravela.

Jak to zrobiÊ… W tej recepturze wykonaj nastÚpujÈce czynnoĂci: 1. W katalogu app/lang dodaj trzy nowe katalogi (jeĂli jeszcze nie istniejÈ): pl, en i de. 2. W katalogu pl utwórz plik localized.php i wprowadě nastÚpujÈcy kod: 'Dzieñ dobry, :name', 'meetyou' => 'Miïo CiÚ poznaÊ!', 'goodbye' => 'Do zobaczenia jutro.', ); 3. W katalogu en utwórz plik localized.php i dodaj nastÚpujÈcy kod: 'Buenos días :name',

145 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

'meetyou' => 'Nice to meet you!', 'goodbye' => 'Adiós, hasta mañana.', ); 4. W katalogu de utwórz plik localized.php i wprowadě nastÚpujÈcy kod: 'Guten morgen :name', 'meetyou' => 'Es freut mich!', 'goodbye' => 'Tag. Bis bald.', ); 5. W pliku routes.php utwórz cztery routingi: Route::get('choose', function() { return View::make('language.choose'); }); Route::post('choose', function() { Session::put('lang', Input::get('language')); return Redirect::to('localized'); }); Route::get('localized', function() { $lang = Session::get('lang', function() { return 'pl'; }); App::setLocale($lang); return View::make('language.localized'); }); Route::get('localized-german', function() { App::setLocale('de'); return View::make('language.localized-german'); }); 6. W katalogu views utwórz folder o nazwie language. 7. W katalogu views/language utwórz plik choose.php i dodaj do niego nastÚpujÈcy kod:

Wybierz jÚzyk:

'polski', 'en' => 'angielski')) ?> 8. W katalogu views/language utwórz plik localized.php o nastÚpujÈcej zawartoĂci:

'Katarzyna Malinowska')) ?>

146 Kup książkę Poleć książkę Rozdziaá 6. • WyĞwietlanie widoków

9. W katalogu views/language utwórz plik localized-german.php i wprowadě nastÚpujÈcy kod:

'Katarzyna Malinowska')) ?>

10. W oknie przeglÈdarki odwiedě adres http://{twój-serwer}/choose (gdzie twój-serwer jest adresem URL serwera), zatwierdě formularz i sprawdě dziaïanie lokalizacji.

Jak to dziaïa… W tej recepturze zaczynamy od utworzenia katalogów dla poszczególnych jÚzyków w folderze app/lang. Tworzymy katalog pl dla plików z polskim tïumaczeniem, en z angielskim oraz de z niemieckim. WewnÈtrz kaĝdego z tych katalogów tworzymy plik o takiej samej nazwie i za- wierajÈcy tablicÚ o identycznych kluczach.

Pierwszym routingiem jest strona wyboru jÚzyka. Moĝemy wybraÊ jÚzyk polski lub angielski. Zatwierdzony wybór jest przesyïany metodÈ POST do routingu, tworzona jest nowa sesja z do- danym wyborem i nastÚpuje przekierowanie na stronÚ z tekstem w wybranym jÚzyku.

Zlokalizowany routing pobiera dane z sesji i przekazuje wybór do metody App::setLocale(). JeĂli w sesji nie jest ustawiona ĝadna wartoĂÊ, domyĂlnie wybierany jest jÚzyk polski.

W zlokalizowanym widoku wypisujemy tekst za pomocÈ metody Lang::get(). W pierwszej linii pliku z tïumaczeniami zamieĂciliĂmy miejsce na nazwÚ :name, które zostanie wypeïnione przez odpowiednie dane z tablicy zwróconej w pliku z tïumaczeniem.

W ostatnim routingu pokazaliĂmy, jak ustawiÊ jÚzyk domyĂlny.

147 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

Tworzenie menu w Laravelu Menu jest elementem wykorzystywanym w wiÚkszoĂci witryn internetowych. W tej recepturze utworzymy menu za pomocÈ zagnieĝdĝonych widoków i zmienimy domyĂlny „stan” jego ele- mentów na podstawie bieĝÈcej strony.

Przygotowanie Do przygotowania menu uĝyjemy standardowej instalacji Laravela.

Jak to zrobiÊ… PostÚpuj zgodnie z poniĝszymi wskazówkami, aby wykonaÊ wszystkie kroki receptury: 1. W pliku routes.php utwórz trzy routingi: Route::get('menu-one', function() { return View::make('menu-layout') ->nest('menu', 'menu-menu') ->nest('content', 'menu-one'); }); Route::get('menu-two', function() { return View::make('menu-layout') ->nest('menu', 'menu-menu') ->nest('content', 'menu-two'); }); Route::get('menu-three', function() { return View::make('menu-layout') ->nest('menu', 'menu-menu') ->nest('content', 'menu-three'); }); 2. W katalogu views utwórz plik menu-layout.php i dodaj nastÚpujÈcy kod: Przykïad menu

3. W katalogu views utwórz plik menu-menu.php i dodaj nastÚpujÈcy kod: 4. W katalogu views utwórz trzy pliki widoków: menu-one.php, menu-two.php i menu-three.php.

149 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

5. W pliku menu-one.php wprowadě nastÚpujÈcy kod:

Pierwsza strona

Lorem ipsum dolor sit amet.

6. W pliku menu-two.php wprowadě nastÚpujÈcy kod:

Druga strona

Suspendisse eu porta turpis

7. W pliku menu-three.php wprowadě nastÚpujÈcy kod:

Trzecia strona

Nullam varius ultrices varius.

8. W oknie przeglÈdarki odwiedě adres http://{twój-serwer}/menu-one (gdzie twój-serwer jest adresem URL Twojego serwera), a nastÚpnie odwiedě ïÈcza dostÚpne w menu.

Jak to dziaïa… Rozpoczynamy od utworzenia trzech routingów dla trzech stron. Wszystkie routingi wykorzy- stujÈ domyĂlny ukïad strony oraz zagnieĝdĝone widoki menu i treĂci, która jest unikalna dla kaĝdego routingu.

Ukïad strony tworzy prosty szkielet HTML z zagnieĝdĝonym kodem CSS. Pragniemy podĂwietliÊ element menu odpowiadajÈcy bieĝÈcej stronie, dodajemy wiÚc do niego klasÚ css active.

NastÚpnie tworzymy widok menu. Wykorzystujemy do tego listÚ nieuporzÈdkowanÈ z ïÈczami do kaĝdej strony. Aby dodaÊ klasÚ active do elementu odpowiadajÈcego bieĝÈcej stronie, sto- sujemy metodÚ Laravela Request::segment(1) do pobrania aktualnego routingu. JeĂli routing jest taki sam jak element na liĂcie, dodajemy klasÚ active, w przeciwnym wypadku zostawiamy jÈ pustÈ. NastÚpnie uĝywamy metody HTML::link() Laravela, aby dodaÊ ïÈcza do stron.

Kolejne trzy widoki sÈ tworzone przez nagïówek i prostÈ treĂÊ, zïoĝonÈ z kilku sïów. Teraz po wejĂciu na stronÚ w oknie przeglÈdarki zobaczymy, ĝe element odpowiadajÈcy bieĝÈcej stro- nie jest podĂwietlony, a pozostaïe elementy nie sÈ. Po klikniÚciu kolejnych ïÈczy podĂwietlony bÚdzie zawsze tylko aktualnie wybrany element.

150 Kup książkę Poleć książkę Rozdziaá 6. • WyĞwietlanie widoków

Integracja z Bootstrapem Framework CSS Bootstrap staï siÚ ostatnio bardzo popularny. W tej recepturze pokaĝemy, jak uĝyÊ tego frameworka w projektach opartych na Laravelu.

Przygotowanie W tej recepturze wykorzystamy standardowÈ instalacjÚ Laravela. Potrzebny nam teĝ bÚdzie pakiet Asset zainstalowany wedïug receptury „Dodawanie zasobów”. Moĝemy teĝ pobraÊ pliki Bootstrapa i zapisaÊ je lokalnie.

Jak to zrobiÊ… Aby wykonaÊ kroki tej receptury, postÚpuj zgodnie z poniĝszymi wskazówkami: 1. W pliku routes.php utwórz nowy routing: Route::any('boot', function() { Asset::add('jquery', 'http://ajax.googleapis.com/ajax /libs/jquery/1.10.2/jquery.min.js'); Asset::add('bootstrap-js', 'http:// netdna.bootstrapcdn.com/twitter- bootstrap/2.3.2/js/bootstrap.min.js', 'jquery'); Asset::add('bootstrap-css', 'http:// netdna.bootstrapcdn.com/twitter- bootstrap/2.3.2/css/bootstrap-combined.min.css'); $superheroes = array('Batman', 'Superman', 'Wolverine', 'Deadpool', 'Iron Man'); return View::make('boot')->with('superheroes', $superheroes); }); 2. W katalogu views utwórz plik boot.php o nastÚpujÈcej zawartoĂci: Strona wykorzystujÈca Bootstrap

Wykorzystywanie Bootstrapa z Laravelem

Witamy na naszej stronie

Lista superbohaterów:

O nas

Cras at dui eros. Ut imperdiet pellentesque mi faucibus dapibus. Phasellus vitae lacus at massa viverra condimentum quis quis augue. Etiam pharetra erat id sem pretium egestas. Suspendisse mollis, dolor a sagittis hendrerit, urna velit commodo dui, id adipiscing magna magna ac ligula. Nunc in ligula nunc.

Formularz kontaktowy


'btn btn-primary')) ?>
3. W oknie przeglÈdarki odwiedě adres http://twój-serwer/boot (gdzie twój-serwer jest adresem URL serwera), a nastÚpnie odwiedě dostÚpne karty.

152 Kup książkę Poleć książkę Rozdziaá 6. • WyĞwietlanie widoków

Jak to dziaïa… W bieĝÈcej recepturze tworzymy pojedynczy routing i zmieniamy zawartoĂÊ za pomocÈ kart Bootstrapa. Aby routing odpowiadaï na wszystkie ĝÈdania, uĝywamy metody Route::any() i przekazujemy do niej domkniÚcie. Pliki CSS i JavaScript moglibyĂmy dodaÊ w sposób opisany w recepturze „Dodawanie zasobów”; ale dla pojedynczego routingu zaïÈczamy je po prostu w domkniÚciu. Nie musimy wiÚc pobieraÊ tych plików — wykorzystujemy wersje Bootstrapa i jQuery dostÚpne na serwerze CDN.

NastÚpnie dodajemy w routingu jakieĂ dane. MoglibyĂmy w tym miejscu podïÈczyÊ bazÚ da- nych, ale na potrzeby naszego przykïadu wystarczajÈca bÚdzie zwykïa tablica zawierajÈca nazwy superbohaterów. NastÚpnie przekazujemy tÚ tablicÚ do widoku.

Widok rozpoczyna kod HTML, w którym zaïÈczamy style w nagïówku, a skrypty przed koñco- wym znacznikiem . W górnej czÚĂci strony wykorzystujemy style nawigacji Bootstrapa oraz atrybuty danych do tworzenia ïÈczy kart. NastÚpnie w ciele strony uĝywamy trzech paneli kart z identyfikatorami odpowiadajÈcymi znacznikowi w menu.

Gdy wchodzimy na stronÚ, pierwszy panel jest widoczny, a wszystkie pozostaïe panele sÈ ukryte. KlikniÚcie innej karty powoduje przeïÈczenie widocznego panelu.

Zobacz takĝe Q Receptura „Dodawanie zasobów”.

Nazwane widoki i kompozytory widoków W tej recepturze zobaczymy, jak uproĂciÊ kod routingu za pomocÈ nazwanych widoków i kom- pozytorów widoku.

Przygotowanie W tej recepturze wykorzystamy kod utworzony w recepturze „Tworzenie menu w Laravelu”.

Potrzebny nam teĝ bÚdzie pakiet Asset zainstalowany wedïug receptury „Dodawanie zasobów”.

Jak to zrobiÊ… Aby wykonaÊ kroki tej receptury, postÚpuj zgodnie z poniĝszymi wskazówkami:

153 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

1. W pliku routes.php file dodaj nastÚpujÈcÈ definicjÚ widoku: View::name('menu-layout', 'layout'); 2. W pliku routes.php dodaj kompozytora widoku: View::composer('menu-layout', function($view) { Asset::add('bootstrap-css', 'http://netdna.bootstrapcdn.com/twitter- bootstrap/2.2.2/css/bootstrap-combined.min.css'); $view->nest('menu', 'menu-menu'); $view->with('page_title', 'Tytuï kompozytora widoku'); }); 3. W pliku routes.php zaktualizuj routingi dla menu: Route::get('menu-one', function() { return View::of('layout')->nest('content', 'menu-one'); }); Route::get('menu-two', function() { return View::of('layout')->nest('content', 'menu-two'); }); Route::get('menu-three', function() { return View::of('layout')->nest('content', 'menu-three'); }); 4. W katalogu views zaktualizuj plik menu-layout.php: <?= $page_title ?>

5. W oknie przeglÈdarki odwiedě adres http://{twój-serwer}/menu-one (gdzie twój-serwer jest adresem URL Twojego serwera), a nastÚpnie odwiedě ïÈcza dostÚpne w menu.

Jak to dziaïa… Rozpoczynamy od utworzenia nazwy dla jednego z widoków. Pozwala nam to skróciÊ nazwy widoków w sytuacjach, gdy sÈ one dïugie lub skomplikowane albo gdy widoki znajdujÈ siÚ w zïoĝonej strukturze katalogów. RównoczeĂnie umoĝliwia to póěniejszÈ szybkÈ zmianÚ na- zwy pliku widoku. Nawet gdy widok jest wykorzystywany w wielu miejscach, zmiana dotyczy tylko jednej linii.

NastÚpnie tworzymy kompozytor widoku. Kod znajdujÈcy siÚ w kompozytorze jest automa- tycznie wywoïywany po utworzeniu widoków. Za kaĝdym razem, gdy tworzymy widok, zaïÈ- czamy trzy zasoby: plik CSS frameworka Bootstrap, zagnieĝdĝony widok oraz zmiennÈ prze- kazywanÈ do widoku.

W naszych trzech routingach zamiast metody View::make('menu-layout') stosujemy utwo- rzonÈ nazwÚ, wywoïujemy metodÚ View::of('layout') i zaïÈczamy jÈ w treĂci strony. Ponie- waĝ nasz ukïad korzysta z kompozytora, menu, plik CSS i tytuï strony zostanÈ automatycznie zaïÈczone.

Zobacz takĝe Q Receptura „Tworzenie menu w Laravelu”.

155 Kup książkę Poleć książkę Laravel. Tworzenie aplikacji. Receptury

156 Kup książkę Poleć książkę Skorowidz

A biblioteka Auth, 58 adres Codeception, 231 e-mail, 248 GD, 53 IP, 248 HybridAuth, 70 localhost, 74, 76 Jcrop, 47 URL, 17, 109 jQuery, 46, 137, 177, 194 Ajax, 177, 185, 191 jQueryUI, 137 aktualizowanie MailChimp, 251 Composera, 161, 173, 229 Mockery, 228, 230 wpisu, 121 PHPUnit, 226 danych o uĝytkowniku, 64 Redactor, 44 API, 118, 168, 221 Stripe, 246 aplikacje Twig, 142 debugowanie, 233 bïÚdy walidacji, 38 profilowanie, 233 bramka pïatnoĂci Stripe, 244 testowanie, 225 atak typu C CSRF, 41, 208 XSS, 202 CAPTCHA, 53 autoloader, 24, 107 chmura, 240 autoloader zaawansowany, 25 chmura Amazon S3, 251 automatyczna walidacja, 90 ciasteczko, 218 automatyczne eskejpowanie, 142 ciÈg dopasowania, 223 autouzupeïnianie, 50 CRUD, create, read, update, delete, 95 autouzupeïnianie przestrzeni nazw, 21 CSRF, Cross-Site Request Forgery, 41, 208 czas odwiedzin routingu, 116 B D baza danych MySQL, 118, 205 dane GeoIP, 247 autouzupeïniania, 51 Redis, 217 o uĝytkowniku, 64 typu klucz-wartoĂÊ, 216 testowe, 119, 123, 163 bezpieczeñstwo, 201 wejĂciowe, 29 z kanaïu RSS, 101

Kup książkę Poleć książkę Skorowidz debugowanie aplikacji, 225, 233, 236 filtr, 208 dodatek DataTables, 199 logowanie, 62, 71, 207 dodawanie obraz CAPTCHA, 53 pakietów do Packagista, 169 pobieranie danych, 31 pakietów do Composera, 171 przesyïanie obrazu, 47 plików CSS, 137 przycinanie obrazu, 48 zasobów, 136 rejestracja, 60, 193, 207 dokumentacja, 24, 87, 95 token CSRF, 208 domkniÚcie, 111 tworzenie, 30 dostawca usïug, 161 wabik, 42 dostawca usïugi AWS, 252 walidacja danych, 33 dostÚp do zaawansowana walidacja, 210 bazy, 205 framework danych, 181 CSS Bootstrap, 151 dystrybucja pakietów, 169 Laravel, 9 funkcja E dd(), 87, 169 fgetcsv(), 101 e-commerce, 213, 244 fopen(), 101 edytor get_headers(), 102 Sublime Text 2, 19 imagecreatefrompng(), 50 WYSIWYG, 44 imagepng(), 50 edytowanie orWhere(), 87 danych, 65 sadd(), 218 programów, 121 simplexml_load_string(), 102 element updateCoords, 50 div, 182 var_dump(), 35 textarea, 46 where(), 87 funkcje F anonimowe, 111 systemu Eloquent, 93 Facebook, 72 wyszukiwania, 183 fasada AWSFacade, 254 filtr, 224 G assets, 137 auth, 68 grupa reguï routingu, 116 auth_admin, 68 grupa routingu, 128 before, 116 csrf, 41, 63, 209, 210 H FILTER_VALIDATE_EMAIL, 35 filtrowanie danych, 188 hashowanie haseï, 205, 207 filtry w routingu, 115 hasïo, 205 flaga --resources, 168 HTML5, 173 format JSON, 120, 181 formularz I automatyczne podpowiedzi, 50 biblioteka Redactor, 44 IDE, Integrated Development Environment, 21 edycja danych, 65 identyfikator, 64 e-mail, 196 aplikacji, 73

256 Kup książkę Poleć książkę Skorowidz

book-list, 182 search, 184 list, 251 storage, 18, 19 results, 185, 187 test, 168 Secret ID, 252 tests, 227, 232 importowanie plików CSV, 99 vendor, 226 informacje views, 131 o karcie kredytowej, 246 vimeolist, 169 o logowaniu, 73 workbench, 168 o odwiedzinach routingu, 116 klasa o pakiecie, 159 Auth, 57 o pliku, 36 BaseController, 182 o uĝytkowniku, 60, 64, 66, 94 Captcha, 53, 55 z modelu, 89 Eloquent, 92, 101 instalowanie Filesystem, 176 biblioteki Auth, 58 Form, 30 biblioteki PHPUnit, 226 Input, 32 Laravela, 13, 14 MailChimp, 251 pakietów, 158 MyAppTest, 228 pakietu Mockery, 230 Spaceship, 229, 240 Sublime, 19 SpaceshipTest, 230 instrukcja TestCase, 228 Validator, 33, 37, 92 @if, 145 klonowanie repozytorium Git, 243 @include(), 145 klucz integracja z Bootstrapem, 151 Access Key ID, 252 API, 191, 221, 246 J API Key, 76 aplikacji, 19, 204 jÚzyk Consumer Key, 75 JavaScript, 177 Consumer Secret, 75 PHP, 251 Secret Key, 76 SQL, 83 SSH, 240 kod CVV karty, 246 K kolejka, 238 kompozytory widoków, 153 kanaï RSS, 101 komunikat o bïÚdzie, 38–41, 197, 212 katalog komunikat o bïÚdzie HTML 401, 224 acceptance, 232 konfigurowanie app, 18, 25 bazy danych, 107 blade, 139, 143 biblioteki Auth, 58 common, 134 biblioteki PHPUnit, 226 controllers, 181 DNS, 126 lang, 145 hostów wirtualnych, 15 language, 146 klienta e-mail, 194 libraries, 55, 105, 249 kontrolera, 181 logs, 116, 240 Laravela, 18 migrations, 59, 80 Ărodowiska deweloperskiego, 15 models, 84, 190, 222 Ărodowiska IDE, 21 myviews, 130 uwierzytelniania OAuth, 69 public, 17 wïasnego routingu, 247

257 Kup książkę Poleć książkę Skorowidz konstruktor attempt(), 64, 208 Fluent, 85 autocomplete, 52 zapytañ Fluent, 87 call, 228 kontener div, 180 check(), 64, 208 konto Amazon AWS, 252 connection(), 218 kontroler, 181 controller(), 113 books, 181 dataTable, 199 REST-owy, 112, 185 deleteRecord(), 98 User, 111, 112 down, 87 zasobów, resourceful controller, 124 encrypt, 205 koszyk zakupowy, 213 file(), 254 kubeïek, bucket, 252 find(), 67 fire(), 176, 240 L first, 230 flashOnly(), 32 Laravel, 9 forget(), 220 liczniki czasu, 236 get(), 95, 147 LinkedIn, 76 getCreate(), 98 lista getIndex(), 113 kubeïków, 253 getRecord(), 98 mailingowa, 248 getUsernameAttribute(), 105 pakietów, 161 guessExtension(), 36 logowanie, 62, 70, 71 input(), 31 z poĂwiadczeniami Facebooka, 72 insert(), 85 z poĂwiadczeniami LinkedIn, 76 intended(), 64 z poĂwiadczeniami Twittera, 74 json(), 46, 182 lokalizacja, 19 link(), 140 listBuckets(), 254 ’ listSubscribe(), 251 loginUsingId(), 64 ïÈczenie tabel, 95 make(), 55, 63, 131, 207 move(), 36 M nest(), 135 of(), 155 maska, 202 old(), 32, 67 mechanizm open(), 36, 38, 41 ClassLoader, 24 postBooks(), 190 hashowania haseï, 207 postIndex(), 113 IoC, 27 postRegister(), 187 OpenID, 70, 72 postSearch(), 185 przechwytywania spamu, 53 push(), 239 przesyïania plików, 35 putObject(), 254 menu, 148 putRecord(), 98 metoda queue(), 240 add(), 138 random(), 55 ajax(), 180 reflash(), 220 all(), 90 route(), 125 allShows(), 85, 87 scripts(), 138 attach(), 95 segment(), 150

258 Kup książkę Poleć książkę Skorowidz

select, 31 plików konfiguracyjnych, 16 send, 197 przesyïania obrazów, 45 setLocale(), 147 Redisa, 216 setupLayout(), 111 relacji, 95 shows(), 95 tabeli, 162 token(), 210 transakcji, 244 user(), 67 wysyïki formularza, 34 users(), 95 odszyfrowywanie danych, 202 validate, 92 okno rejestracji, 191 with(), 133 opcje routingu, 113 metody oprogramowanie LAMP, 10 HTTP, 123 konstruktora zapytañ, 87 P statyczne, 169 typu getter, 104 Packagist, 169 migracja, 80, 104, 127 pakiet, 158 model Amazon SDK, 252 Eloquent, 199 Ardent, 92 Show, 87 Asset, 136 Spaceship, 230 Composer, 157, 165, 169 User, 60, 92 DataTables, 199 moduï Generators, 161, 165 mod_rewrite, 17 HybridAuth, 69 zaleĝny, 14, 15 imagine, 161 MVC, Model-View-Controller, 110 IronMQ, 239 Laravel 4 Snippets, 21 N Laravel-Blade, 21 MailChimp, 193 nadawanie uprawnieñ administratora, 63 Mockery, 228 nagïówek, 135 Package Control, 19 narzÚdzie TwigBranch, 142 Artisan, 59, 69, 80, 123 Universal Forms, 171 Composer, 14, 24 parametr curl, 123 --blade, 176 Workbench, 165 raw, 142 nazwa pÚtla @foreach, 145 kubeïka, 254 platforma Pagoda Box, 240, 243 routingu, 124 plik subdomeny, 125 .htaccess, 17 newsletter, 191, 248 accounts.php, 204 add_users_data, 127 O ajaxemail.php, 195 Api.php, 222 obsïuga api-key.php, 222 adresów URL, 109 app.php, 18, 252 danych, 34 artisan.php, 176 formularza rejestracji, 60 auth.php, 58 koszyka zakupów, 213 autocomplete.php, 51 obrazów, 44 AviatorCept.php, 231

259 Kup książkę Poleć książkę Skorowidz plik Odd.php, 104 aws.php, 252 openid_auth.php, 70 BaseController.php, 111 pay.blade.php, 245 Book.php, 190 profile.php, 65 Bookprices.php, 198 profile_edit.php, 65 BooksController.php, 181, 189 queue.php, 238 boot.php, 151 record.php, 98 Captcha.php, 53 redactor.php, 45 cart.php, 215 redis-login.php, 217 choose.php, 146 register.php, 206 cloud.blade.php, 253 registration.php, 60 composer.json, 26, 53, 69, 105, 136, 159–161, routes.php, 30, 35, 37 171, 191, 226, 238, 244, 247–252 scifi.csv, 99 create.php, 97 Scifi.php, 100 create_users_table, 126 SearchController.php, 183 cross-site.php, 209 second.blade.php, 139, 144 database.php, 18, 58 second.php, 130, 132 DatabaseSeeder.php, 234 session.php, 58 emailform.php, 194 session-one.php, 218 fb_auth.php, 73 ships.blade.php, 235 fileform.php, 35 ShipsController.php, 229, 235 filters.php, 68, 117, 136, 209, 224, 247 Show.php, 84, 86, 89 footer.php, 134, 137 show-delete.php, 122 geoip, 247 signup.php, 191 getting-data.php, 179 SkeletonCommand.php, 174 global.php, 25 Spaceship.php, 235, 239 header.php, 134, 137 SpaceshipSeeder.php, 234 home.blade.php, 139, 143 SpaceshipTest.php, 229 home.php, 130, 132 stripe.php, 245 httpd.conf, 16, 126 subscribe.blade.php, 250 httpd-vhosts.conf, 16 SuperheroesTableSeeder.php, 163 imageform.php, 47 table.php, 198 index.blade.php, 139 tw_auth.php, 75 index.php, 15, 186, 189 twig.twig, 141 info.blade.php, 144 twiglayout.twig, 141 item-detail.php, 215 User.php, 91 items.php, 214 userform.php, 30, 33 jcrop.php, 48 userinfo.php, 134 li_auth.php, 76 UsersController.php, 96, 110, 185 localized.php, 145 valid.php, 211 login.php, 62, 71 validation.php, 40 mailchimp.php, 191, 249 validator.php, 212 menu-layout.php, 148, 154 Vimeolist.php, 166 menu-menu.php, 149 VimeolistServiceProvider.php, 167 myapp.php, 42 workbench.php, 165 MyAppTest.php, 227 pliki myform.php, 39 .jpg, 39 MyShapes.php, 24, 26 .png, 50 oauth.php, 69 .twig, 142

260 Kup książkę Poleć książkę Skorowidz

autoloadingu, 251 przesyïanie Bootstrapa, 151 kluczy, 224 CSS, 137, 153 obrazów, 44, 47 CSV, 99 pakietów, 170 frameworka, 15 plików, 35 JavaScript, 153 przeszukiwanie bazy GeoIP, 247 migracji, 59, 80, 233 przycinanie obrazu, 47, 48 z szablonami, 21 pobieranie R danych, 178 danych o uĝytkowniku, 64 Redis, 216 danych wejĂciowych, 29 reguïa walidacji, 212 listy, 84, 86 reguïy routingu, 116 pakietów, 158 rejestrowanie podïÈczanie frameworka, 15 klucza api, 222 pole kontrolera, 186 tekstowe, 50 routingu, 113 typu checkbox, 63 relacja wiele do wielu, 95 ukryte, 98 relacje, 95 wyboru, 188 repozytorium Git, 14, 170, 243 polecenia SQL, 188, 197, 202 routing, 32, 45 polecenie admin-only, 116 artisan, 233, 236 blade-home, 143 bootstrap, 232 blade-second, 143 composer install, 15 cloud, 254 dump-autoload, 26, 169, 251 dla administratorów, 68 git clone, 15, 243 domyĂlny, 232 phpunit, 226, 227 e-mail-form, 197 poĂwiadczenia email-send, 196 bezpieczeñstwa, 252 fbauth, 74 Facebooka, 72 liauth, 78 LinkedIn, 76 link, 125 serwisu Amazon, 254 myapp, 228 Twittera, 74 named, 125 prefiks profile, 118 nazwany, 124 proces migracji, 123, 127 pay, 246 profiler, 236 redirect, 125 profilowanie aplikacji, 233 REST-owy, 112 przechowywanie ship, 231 danych, 79 show-delete, 123 danych sesji, 202 show-form, 123 kluczy API, 193, 221 shows, 85, 87, 89 listy, 82 signup-submit, 193 sesji, 60, 216 z domkniÚciem, 111 przechwytywanie spamu, 53 rusztowanie, 162 przekazywanie danych do widoku, 131 przekierowanie, 32, 55, 64, 72, 216 przestrzeñ nazw, 25

261 Kup książkę Poleć książkę Skorowidz

S szablon Blade, 140, 142 schemat, 80 Twig, 140, 142 schemat shows, 82 szablony kodu, 21 serializacja danych, 193 szkielet serwer aplikacji, 161 Apache, 15 kodu HTML5, 173 Apache 2, 10 szyfrowanie danych, 202 API, 221 CDN, 137, 180 ¥ deweloperski, 15 HTTP, 15 Ărodowisko uruchomieniowe, 15 MAMP, 10 MySQL 5.6, 10 T Redis, 216 WAMP, 10, 16 tabela, 80 XAMMP, 10 accounts, 205 serwis books, 190 Amazon S3, 251 cities, 162 GitHub, 169 items, 213 MailChimp, 191, 249 migracji, 80, 90 Pagoda Box, 240 shows, 89, 123 sesja, 201, 218 superheroes, 107, 164 skrypt users, 92 autocomplete, 52 tablica composer, 54 $cities, 162, 165 sortowanie, 197 $rules, 39 spam, 53 aliases, 236 sprawdzanie adresu IP, 248 aliasów, 136 standard attributes, 41 PSR-0, 25 cart, 216 W3C, 30 providers, 141, 161 sterownik bazy danych technika mysql, 19 Ajax, 185, 191 pgsql, 19 scaffoldingu, 162 sqlite, 19 test sqlsrv, 19 akceptacyjny, 231 sterownik native, 60 jednostkowy, 227 stopka, 135 testowanie strona profilu uĝytkownika, 62 aplikacji, 225 subdomena, 125, 128 kontrolerów, 228 symbole wieloznaczne, 114, 126 kubeïków, 253 system token CSRF, 208, 210 CRUD, 95 Eloquent, 99 Twitter, 74 IronMQ, 238 tworzenie ORM Eloquent, 60, 88, 93, 105, 205, 230 adresów URL, 17 RedBeanPHP, 107 filtra, 118, 137, 224 szablonów Blade, 21, 138, 142 formularza, 30 szablonów Twig, 140 funkcji wyszukiwania, 183

262 Kup książkę Poleć książkę Skorowidz

grup reguï, 117 usïugi firm trzecich, 237, 248 grupy routingu, 128 ustawienia konfiguracyjne, 19 kolejek, 238 usuwanie wpisu, 121 komunikatu o bïÚdzie, 39 uwierzytelnianie, 58, 60, 71 kontrolera REST-owego, 112 OAuth, 69 kontrolerów, 110 procesu logowania, 63 koszyka zakupowego, 213 mechanizmu przesyïania plików, 35 W menu, 148 obrazu CAPTCHA, 53 wabik, honey pot, 42 okna rejestracji, 191 walidacja, 40, 43 pakietu Composera, 165 automatyczna, 90 pliku migracji, 82, 233 danych, 33 pola tekstowego, 50 dïugoĂci tekstu, 35 reguï, 44 przesyïanych plików, 37 reguïy walidacji, 212 uĝytkownika, 185 repozytorium Git, 170 zaawansowana, 210 REST-owego API, 118 wczytywanie widoku, 30, 133 routingu, 21, 25, 32, 111 wiadomoĂci e-mail, 194 schematu dla tabeli, 118 widok, 129 Patrz takĝe plik serwera API, 221 autocomplete.php, 51 systemu CRUD, 95 captcha.php, 54 systemu uwierzytelniania, 57, 60 fileform.php, 35 szkieletu aplikacji, 161 home, 135 tabeli, 80, 197 info, 145 tabeli ïÈczÈcej, 95 myapp.php, 42 tabeli migracji, 82 myform.php, 39 testów, 168, 227 profile.php, 65 unikalnego klucza, 19 redactor.php, 45 uĝytkownika, 185 ships.blade.php, 235 walidatora, 35, 43 userform.php, 30, 33 widoku, 130, 138 userinfo, 135 wïasnego polecenia, 173 zagnieĝdĝony, 133, 138 zaawansowanych autoloaderów, 25 widoki nazwane, 153 zapytañ, 83, 85, 88 wïÈczanie uwierzytelniania, 71 zlokalizowanej zawartoĂci, 145 wyjÈtek TokenMismatchException, 210 znaczników czasu, 82 wykorzystywanie danych, 79 typ MIME, 38 wysyïanie wiadomoĂci e-mail, 194 wyszukiwanie, 183 U wyĂwietlanie bïÚdów, 34 uruchamianie testów, 227 danych, 32, 168 Codeception, 232 formularza, 39 PHPUnit, 228 informacji, 87, 89, 203 usïuga listy, 122 hostingu, 240, 244 ïÈcza, 124 MailChimp, 248 obrazu, 49 Stripe, 246 widoków, 129

263 Kup książkę Poleć książkę Skorowidz wywoïanie znacznik kaskadowe, 133 , 153 routingu, 43

, 31 zwrotne, 74, 76 , 46 wzorzec MVC, 110 znak $, 142 zrzut danych autoloadera, 106 Z ¿ zabezpieczanie informacji, 204 zapisywanie informacji, 203 ĝÈdania typu AJAX, 52 zapytania, 83, 85, 88 ĝÈdanie zastosowanie sesji, 218 GET, 113, 228 zlokalizowane treĂci, 145 POST, 31, 224 zmiana nazw kolumn, 102 zmienna $app, 169 $error, 38 $table, 101 sesyjna typu flash, 220

264 Kup książkę Poleć książkę