Tytuł oryginału: Extending Symfony 2 Web Application Frameworkpdf.helion.pl/sym2rf/sym2rf.pdf ·...

30

Transcript of Tytuł oryginału: Extending Symfony 2 Web Application Frameworkpdf.helion.pl/sym2rf/sym2rf.pdf ·...

Tytuł oryginału: Extending Symfony 2 Web Application Framework

Tłumaczenie: Łukasz Piwko

ISBN: 978-83-283-0294-5

Copyright © Packt Publishing 2014.

First published in the English language under the title „Extending Symfony 2 Web Application Framework”.

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 HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: 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/sym2rfMożesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/sym2rf.zip

Printed in Poland.

• Kup książkę• Poleć książkę • Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

Spis tre ci

O autorze 5

O recenzentach 7

Wst p 9

Zawarto ksi ki 9Co jest potrzebne? 10Dla kogo jest ta ksi ka? 10Konwencje 11Pomoc 11

Rozdzia 1. Us ugi i procedury nas uchowe 13

Us ugi 13Us uga geolokalizacji 14Testowanie us ug i testowanie przy u yciu us ug 19Znakowanie us ug 21

Procedury nas uchuj ce 25Aktualizowanie preferencji u ytkownika przy u yciu w asnych zdarze 27Poprawianie wydajno ci 30

Podsumowanie 32

Rozdzia 2. Polecenia i szablony 33

Polecenia 33Pocz tkowa sytuacja 33Zmienianie rozmiaru obrazów u ytkowników 34Testowanie polecenia 37Polecenia jako interfejs do us ug 38

Twig 40Zarz dzanie skryptami 41Testowanie rozszerzenia Twig 43Filtr ró nicy czasowej 44

Podsumowanie 45

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

Spis tre ci

4

Rozdzia 3. Formularze 47

Element wej ciowy dla wspó rz dnych geograficznych 47Podstawowa konfiguracja 49U ywanie mapy 51

Przekszta canie danych 54Formularze wykorzystuj ce dane u ytkowników 56O krok dalej 57

Pocz tkowa konfiguracja 58Dodawanie i usuwanie pól 60

Podsumowanie 62

Rozdzia 4. Bezpiecze stwo 63

Uwierzytelnianie 63Proste uwierzytelnianie OAuth poprzez GitHub 64

Autoryzacja 74Votery 75Adnotacje 80

Zabezpieczanie API — przyk ad 85Podsumowanie 87

Rozdzia 5. Doctrine 89

Tworzenie w asnych typów danych 89Miejsce przebywania u ytkowników i miejsca spotka 89Testowanie 92

W asne funkcje DQL 93Kontrola wersji 97

Ustawianie wersji wszystkich jednostek 99U ywanie i aktualizowanie wersji 100Testowanie 101

Tworzenie filtra Doctrine 103Podsumowanie 106

Rozdzia 6. Udost pnianie w asnych rozszerze innym programistom 107

Tworzenie pakietu 107Udost pnianie konfiguracji 110

Przygotowanie do udost pnienia pakietu 116Badania 116Dokumentacja 116Testowanie 116Dystrybucja i licencjonowanie 118Czy to jest tylko pakiet? 119

Podsumowanie 120

Skorowidz 121

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

1

Us ugi i procedurynas uchowe

W rozdziale tym znajduje si opis podstawowych wiadomo ci na temat systemu Symfony2.Najwa niejszym poj ciem jest us uga (ang. service). W istocie wi ksza cz samego systemujest wielkim zbiorem gotowych do u ywania us ug. Na przyk ad po zainstalowaniu systemumo na przej w konsoli do katalogu g ównego projektu i wpisa polecenie php app/consolecontainer:debug, aby wy wietli list wszystkich aktualnie zdefiniowanych w aplikacji us ug.Je li to zrobisz, dowiesz si , e nawet jeszcze przed rozpocz ciem pracy masz do dyspozycjiprawie 200 us ug. Polecenie php app/console container:debug <nazwa_us ugi> zwraca infor-macje o wybranej us udze; przyda si ono wielokrotnie w trakcie studiowania tej ksi ki.

Us ugiUs uga jest konkretnym egzemplarzem jakiej klasy. Gdy programista u ywa, powiedzmy, doctri-ne, np. $this->get('doctrine'); w kontrolerze, znaczy to, e korzysta z us ugi. Ta us uga jestegzemplarzem klasy Doctrine EntityManager, którego nigdy nie trzeba tworzy samodzielnie. Kodpotrzebny do jego utworzenia jest do skomplikowany, poniewa wymaga po czenia z bazdanych, pewnych parametrów konfiguracyjnych itd. Gdyby ta us uga nie by a ju zdefiniowa-na, trzeba by tworzy takie egzemplarze samodzielnie. Gdyby zasz a konieczno zrobieniatego w ka dym kontrolerze, kod aplikacji sta by si zagmatwany i trudny w obs udze.

Oto kilka z domy lnych us ug dost pnych w Symfony2: czytnik adnotacji, Assetic — biblioteka do zarz dzania zasobami,

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

Symfony2. Rozbudowa frameworka

14

dyspozytor zdarze , fabryka wid etów formularza i formularzy, j dro i sk adnik HttpKernel Symfony2, monolog — biblioteka obs ugi dzienników, ruter, Twig — silnik szablonów.

W systemie Symfony2 bardzo atwo tworzy si nowe rozszerzenia. Je li Twój kontroler bardzosi rozrós i trudno nad nim zapanowa , dobrym sposobem jego poprawienia i uproszczeniajest przesuni cie cz ci kodu do us ug. Wi kszo us ug to obiekty singletonowe, czyli mog -ce wyst powa tylko w pojedynczym egzemplarzu.

Us uga geolokalizacjiWyobra sobie aplikacj tworz c listy zdarze , które nazwiemy „spotkaniami”. Kontrolerumo liwia nam pobranie najpierw adresu IP bie cego u ytkownika, sprawdzenie z wykorzysta-niem tego IP lokalizacji tego u ytkownika oraz wy wietlenie spotka w promieniu 50 kilome-trów. Aktualnie ca y kod znajduje si w kontrolerze. Na razie jeszcze kontroler ten nie jestzbyt d ugi — zawiera jedn metod i ca a klasa zajmuje jakie 50 wierszy kodu. Ale z czasemdodamy wi cej kodu, aby na przyk ad móc wy wietla tylko ulubione spotkania u ytkownikaalbo takie, w których u ytkownik bra udzia najcz ciej. Gdy po czy si te wszystkie infor-macje i doda skomplikowane obliczenia maj ce na celu znalezienie najodpowiedniejszychspotka dla danego u ytkownika, kod mo e rozrosn si do niebotycznych rozmiarów!

Ten prosty problem mo na rozwi za na kilka sposobów. Logik geokodowania mo na na razieprzenie do osobnej metody. B dzie to dobre tymczasowe posuni cie, ale lepiej my le przysz o-ciowo i przenie cz logiki do us ug, do których nale y. Aktualnie nasz kod wygl da tak:

use Geocoder\HttpAdapter\CurlHttpAdapter;use Geocoder\Geocoder;use Geocoder\Provider\FreeGeoIpProvider;

public function indexAction() {

Narz dzia do geokodowania (oparte na doskona ej bibliotece geokodowania — http://geocoder-php.org/) zainicjujemy przy u yciu nast puj cego kodu:

$adapter = new CurlHttpAdapter();$geocoder = new Geocoder();$geocoder->registerProviders(array( new FreeGeoIpProvider($adapter),));

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

Rozdzia 1. • Us ugi i procedury nas uchowe

15

Pobieramy adres IP u ytkownika:

$ip = $this->get('request')->getClientIp();// Mo na te u y domy lnego.if ($ip == '127.0.0.1') { $ip = '114.247.144.250';}

Pobieramy wspó rz dne i dostosowujemy je przy u yciu poni szego kodu, aby tworzy y mniejwi cej kwadrat o boku 50 km:

$result = $geocoder->geocode($ip);$lat = $result->getLatitude();$long = $result->getLongitude();$lat_max = $lat + 0.25; // oko o 25 km$lat_min = $lat - 0.25;$long_max = $long + 0.3; // oko o 25 km$long_min = $long - 0.3;

Na podstawie tych wszystkich informacji tworzymy zapytanie:

$em = $this->getDoctrine()->getManager();$qb = $em->createQueryBuilder();$qb->select('e') ->from('KhepinBookBundle:Meetup', 'e') ->where('e.latitude < :lat_max') ->andWhere('e.latitude > :lat_min') ->andWhere('e.longitude < :long_max') ->andWhere('e.longitude > :long_min') ->setParameters([ 'lat_max' => $lat_max, 'lat_min' => $lat_min, 'long_max' => $long_max, 'long_min' => $long_min ]);

Pobieramy wyniki i przekazujemy je do szablonu:

$meetups = $qb->getQuery()->execute();return ['ip' => $ip, 'result' => $result, 'meetups' => $meetups];}

Chcemy si pozby inicjacji geokodowania. Najlepiej, eby wszystko to odbywa o si automatycz-nie, a dost p do geokodera odbywa si za pomoc instrukcji $this->get('geocoder');.

Sk d pobra przyk ady kodu?

Pliki z przyk adami kodu ród owego mo na pobra z serwera FTP wydawnictwa Helion pod adresemftp://ftp.helion.pl/przyklady/sym2rf.zip.

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

Symfony2. Rozbudowa frameworka

16

Us ugi mo na definiowa bezpo rednio w pliku config.yml systemu Symfony pod kluczemservices, jak pokazano poni ej:

services: geocoder: class: Geocoder\Geocoder

To wszystko! Zdefiniowali my us ug , która jest teraz dost pna we wszystkich naszych kontrole-rach. Teraz nasz kod wygl da tak:

// Tworzy klas geokodowania.$adapter = new \Geocoder\HttpAdapter\CurlHttpAdapter();$geocoder = $this->get('geocoder');$geocoder->registerProviders(array( new \Geocoder\Provider\FreeGeoIpProvider($adapter),));

Ju widz , jak przewracasz oczami i stwierdzasz, e to niewiele pomaga. Jest tak, poniewainicjacja geokodera jest nieco bardziej skomplikowana ni zwyk e wywo anie new \Geocoder\Geocoder(). Konieczne jest utworzenie obiektu innej klasy i przekazanie go jako parametru dometody. Dobra wiadomo jest taka, e wszystko to mo na zrobi w definicji us ugi. Wystarczytylko j zmodyfikowa w nast puj cy sposób:

services: # Definiuje klas adaptacyjn . geocoder_adapter: class: Geocoder\HttpAdapter\CurlHttpAdapter public: false # Definiuje klas dostawcz . geocoder_provider: class: Geocoder\Provider\FreeGeoIpProvider public: false # Klasie dostawczej jest przekazywany adapter jako argument. arguments: [@geocoder_adapter] geocoder: class: Geocoder\Geocoder # Po inicjacji wywo ujemy na geokoderze metod , aby ustawi odpowiednie parametry. calls: - [registerProviders, [[@geocoder_provider]]]

Ten kod jest ju troch d u szy, ale to jest jedyne miejsce, w którym musimy go napisa . Wartozwróci uwag na par rzeczy:

W rzeczywisto ci zdefiniowali my trzy us ugi, poniewa nasz geokoder wymagaegzemplarzy dwóch innych klas.

Aby przekaza referencj do us ugi jako argument do innej us ugi, u yli my sk adni@+nazwa_us ugi.

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

Rozdzia 1. • Us ugi i procedury nas uchowe

17

Nie musimy si ogranicza tylko do definicji new Class($argument);. Mo emy tewywo a metod na klasie po utworzeniu jej egzemplarza. Istnieje nawetmo liwo bezpo redniego ustawiania w a ciwo ci, je li s publiczne.

Dwie pierwsze us ugi oznaczyli my jako prywatne, co znaczy, e nie b d dost pnew kontrolerach. Mog natomiast by wstrzykiwane przez kontener wstrzykiwaniazale no ci (ang. dependency injection container — DIC) do innych us ug.

Teraz nasz kod wygl da tak:

// Pobiera adres IP u ytkownika.$ip = $this->get('request')->getClientIp();

// Albo u ywa domy lnego.if ($ip == '127.0.0.1') { $ip = '114.247.144.250';}// Sprawdza wspó rz dne u ytkownika.$result = $this->get('geocoder')->geocode($ip);$lat = $result->getLatitude();// ... Reszta kodu pozostaje bez zmian.

W tym przypadku kontrolery rozszerzaj klas BaseController, która ma dost p do DIC, poniewaimplementuje interfejs ContainerAware. Wszystkie wywo ania $this->get('nazwa_us ugi') sprzekazywane kontenerowi, który konstruuje (w razie potrzeby) i zwraca us ug .

Posuniemy si jeszcze dalej i zdefiniujemy w asn klas , która bezpo rednio b dzie pobieraadres IP u ytkownika oraz zwraca tablic maksymalnych i minimalnych d ugo ci i szeroko cigeograficznych. Utworzymy nast puj c klas :

namespace Khepin\BookBundle\Geo;

use Geocoder\Geocoder;use Symfony\Component\HttpFoundation\Request;

class UserLocator {

protected $geocoder;

protected $user_ip;

public function __construct(Geocoder $geocoder, Request $request) { $this->geocoder = $geocoder; $this->user_ip = $request->getClientIp(); if ($this->user_ip == '127.0.0.1') { $this->user_ip = '114.247.144.250'; }

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

Symfony2. Rozbudowa frameworka

18

}

public function getUserGeoBoundaries($precision = 0.3) { // Sprawdza wspó rz dne u ytkownika. $result = $this->geocoder->geocode($this->user_ip); $lat = $result->getLatitude(); $long = $result->getLongitude(); $lat_max = $lat + 0.25; // oko o 25 km $lat_min = $lat - 0.25; $long_max = $long + 0.3; // oko o 25 km $long_min = $long - 0.3; return ['lat_max' => $lat_max, 'lat_min' => $lat_min, 'long_max' => $long_max, 'long_min' => $long_min]; }}

Konstruktor tej klasy przyjmuje jako argumenty zmienne geocoder i request, a nast pnie klasa tawykonuje ca prac , któr na pocz tku wykonywali my w kontrolerze. Podobnie jak wcze niej,klas t zdefiniujemy jako us ug , aby by a atwo dost pna w kontrolerach:

# config.ymlservices: #...user_locator: class: Khepin\BookBundle\Geo\UserLocator scope: request arguments: [@geocoder, @request]

Zwró uwag na definicj zakresu w tym kodzie. DIC ma domy lnie dwa zakresy: containeri prototype, do których system dodaje jeszcze trzeci, o nazwie request. W poni szej tabeli znaj-duje si opis ró nic mi dzy nimi.

Zakres Ró nice

container Wszystkie wywo ania $this->get('service_name') zwracaj ten sam egzemplarz us ugi.

prototype Wszystkie wywo ania $this->get('service_name') zwracaj nowy egzemplarz us ugi.

request Wszystkie wywo ania $this->get('service_name') zwracaj ten sam egzemplarz us ugiw daniu. Symfony mo e mie dania podrz dne (np. zawieraj ce kontroler w Twig).

Z wykonanych dzia a odnie li my tak korzy , e us uga samodzielnie zdobywa wszystkiepotrzebne jej informacje, ale niestety staje si bezu yteczna w kontekstach, w których nie ma

da . Gdyby my chcieli utworzy polecenie pobieraj ce wszystkie adresy IP, z którymi czy siu ytkownik, i wysy aj ce mu wiadomo ci o spotkaniach odbywaj cych si w weekend w jegookolicy, to ten projekt uniemo liwi by nam u ycie potrzebnej do tego klasy Khepin\BookBundle\Geo\UserLocator.

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

Rozdzia 1. • Us ugi i procedury nas uchowe

19

Jak wida , domy lnie us ugi znajduj si w zakresie kontenera, co znaczy, e ich egzemplarz jest two-rzony tylko raz, a potem wielokrotnie u ywany zgodnie z zasadami wzorca projektowego Singleton. Ponadtonale y zauwa y , e DIC nie tworzy wszystkich us ug natychmiast, tylko na danie. Je li kod znajduj cysi w innym kontrolerze nie u ywa us ugi user_locator, to ani ta us uga, ani adna z us ug, od którychzale y (geocoder, geocoder_provider i geocoder_adapter), nie zostanie utworzona.

Ponadto nale y pami ta , e konfiguracja zapisana w pliku config.yml jest buforowana w rodowiskuprodukcyjnym, dzi ki czemu definicja tych us ug powoduje minimalny lub wr cz zerowy narzut.

Teraz nasz kontroler jest ju znacznie prostszy i wygl da nast puj co:

$boundaries = $this->get('user_locator')->getUserGeoBoundaries();// Tworzy zapytanie do bazy danych.$em = $this->getDoctrine()->getManager();$qb = $em->createQueryBuilder();$qb->select('e') ->from('KhepinBookBundle:Meetup', 'e') ->where('e.latitude < :lat_max') ->andWhere('e.latitude > :lat_min') ->andWhere('e.longitude < :long_max') ->andWhere('e.longitude > :long_min') ->setParameters($boundaries);// Pobiera informacje o interesuj cych spotkaniach.$meetups = $qb->getQuery()->execute();return ['meetups' => $meetups];

Najwi cej miejsca zajmuje zapytanie Doctrine, które atwo mo na przenie do klasy repozyto-rium, aby jeszcze bardziej upro ci kontroler.

Jak wida na przedstawionym przyk adzie, definiowanie i tworzenie us ug w Symfony2 jest doatwe i niezbyt kosztowne. Utworzyli my w asn klas UserLocator, zamienili my j w us ug oraz

dowiedzieli my si , e mo e ona zale e od innych naszych us ug, np. @geocoder. Nie sko czyli-my jeszcze z us ugami ani DIC, poniewa s to podstawowe sk adniki prawie wszystkich

technik zwi zanych z rozszerzaniem systemu Symfony2. B dzie o nich mowa jeszcze wiele razyw tej ksi ce i dlatego zanim przejdziemy dalej, koniecznie musimy je dobrze zrozumie .

Testowanie us ug i testowanie przy u yciu us ugJedn z wielkich zalet umieszczania kodu w us ugach jest to, e us ugi s po prostu klasamiPHP. Dzi ki temu mo na je szybko testowa . Nie trzeba do tego kontrolera ani DIC. Wystarczytylko utworzy atrapy klas geocoder i request.

W folderze test pakietu mo na utworzy folder o nazwie Geo, w którym b dziemy testowanasz klas UserLocator. Jako e testowana b dzie zwyk a klasa PHP, nie trzeba u ywa klasyWebTestCase. Wystarczy nam standardowa klasa PHPUnit_Framework_TestCase. Nasza klasa zawiera

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

Symfony2. Rozbudowa frameworka

20

tylko jedn metod geokoduj c adres IP i zwracaj c zbiór wspó rz dnych okre lonych z wyzna-czon precyzj . Mo emy imitowa dzia anie geokodera przez zwracanie na sztywno ustawio-nych liczb, dzi ki czemu nie b dziemy musieli wykonywa wywo a sieciowych, które spo-wolni yby nasze testy. Poni ej znajduje si prosty przypadek testowy:

class UserLocatorTest extends PHPUnit_Framework_TestCase{ public function testGetBoundaries() { $geocoder = $this->getMock('Geocoder\Geocoder'); $result = $this->getMock('Geocoder\Result\Geocoded');

$geocoder->expects($this->any())->method('geocode')- >will($this->returnValue($result)); $result->expects($this->any())->method('getLatitude')- >will($this->returnValue(3)); $result->expects($this->any())->method('getLongitude') ->will($this->returnValue(7));

$request = $this->getMock ('Symfony\Component\HttpFoundation\Request', ['getUserIp']); $locator = new UserLocator($geocoder, $request);

$boundaries = $locator->getUserGeoBoundaries(0);

$this->assertTrue($boundaries['lat_min'] == 3); }}

Teraz mo emy sprawdzi , czy dzia a nasza klasa, ale co z reszt logiki kontrolera?

Dla kontrolera mo emy napisa prosty test integracyjny, aby sprawdzi , czy na wyrenderowanejstronie znajduj si informacje o jakich spotkaniach. Ale w niektórych przypadkach podczastestowania lepiej jest nie wywo ywa zewn trznych us ug ze wzgl du na wydajno , wygodlub po prostu brak takiej mo liwo ci. W takiej sytuacji równie mo na pos u y si atrapamius ug, które b d u ywane w kontrolerze. W naszych testach musimy to zrobi tak:

public function testIndexMock(){ $client = static::createClient(); $locator = $this->getMockBuilder ('Khepin\BookBundle\Geo\UserLocator') ->disableOriginalConstructor()->getMock(); $boundaries = ["lat_max" => 40.2289, "lat_min" => 39.6289, "long_max" => 116.6883, "long_min" => 116.0883]; $locator->expects($this->any())->method ('getUserGeoBoundaries')->will($this- >returnValue($boundaries));

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

Rozdzia 1. • Us ugi i procedury nas uchowe

21

$client->getContainer()->set('user_locator', $locator); $crawler = $client->request('GET', '/'); // Sprawdza, czy strona zawiera oczekiwane informacje o spotkaniach.}

W kodzie tym utworzyli my atrap klasy UserLocator, która zawsze zwraca te same wspó rz dne.Dzi ki temu mamy wi ksz kontrol nad tym, co testujemy, i nie musimy d ugo czeka na wywo-anie serwera geolokacyjnego.

Znakowanie us ugZapewne podczas u ywania systemu Symfony spotka e si ju z oznakowanymi us ugami, np.przy definiowaniu w asnych wid etów formularza albo voterów zabezpiecze . Oznakowanymi us u-gami s te procedury nas uchu zdarze , o których b dzie mowa w drugiej cz ci tego rozdzia u.

W poprzednich przyk adach utworzyli my us ug user_locator, której dzia anie zale y od us ugigeokodowania. Ale u ytkownika mo na zlokalizowa na wiele sposobów. Mo na pos u y sidanymi adresowymi z profilu, co jest szybsz i dok adniejsz metod ni sprawdzanie wed ugadresu IP. Mo na te u y ró nych dostawców internetowych, takich jak FreeGeoIp, co zro-bili my w poprzednim kodzie, albo utrzymywa lokaln baz danych geoip. Mo na nawet wszyst-kie te techniki zaimplementowa w jednej aplikacji i wypróbowywa je jedn po drugiej, za-czynaj c od najbardziej dok adnej.

Interfejs dla tego nowego typu geokodera zdefiniujemy nast puj co:

namespace Khepin\BookBundle\Geo;

interface Geocoder{ public function getAccuracy();

public function geocode($ip);}

Nast pnie zdefiniujemy dwa geokodery przy u yciu poni szego kodu. Pierwszy z nich opakowujeistniej cy geokoder w now klas implementuj c nasz interfejs Geocoder:

namespace Khepin\BookBundle\Geo;use Geocoder\Geocoder as IpGeocoder;

class FreeGeoIpGeocoder implements Geocoder{ public function __construct(IpGeocoder $geocoder) { $this->geocoder = $geocoder; }

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

Symfony2. Rozbudowa frameworka

22

public function geocode($ip) { return $this->geocoder->geocode($ip); }

public function getAccuracy() { return 100; }}

Pierwszy typ geokodera jest skonfigurowany nast puj co:

freegeoip_geocoder: class: Khepin\BookBundle\Geo\FreeGeoIpGeocoder arguments: [@geocoder]

Drugi geokoder za ka dym razem zwraca losow lokalizacj :

namespace Khepin\BookBundle\Geo;

class RandomLocationGeocoder implements Geocoder{ public function geocode($ip) { return new Result(); }

public function getAccuracy() { return 0; }}

class Result{ public function getLatitude() { return rand(-85, 85); }

public function getLongitude() { return rand(-180, 180); }

public function getCountryCode() { return 'CN'; }}

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

Rozdzia 1. • Us ugi i procedury nas uchowe

23

Konfiguracja drugiego geokodera wygl da tak:

random_geocoder: class: Khepin\BookBundle\Geo\RandomLocationGeocoder

Je li zmienimy konfiguracj naszej us ugi user_locator tak, aby przestawi j na u ywanie jedne-go z tych geokoderów, wszystko nam zadzia a. Ale my chcemy, aby nasza us uga bez adnychzmian w jej kodzie mog a u ywa wszystkich dost pnych metod oraz wybra najbardziej pre-cyzyjn z nich, nawet gdy zostan dodane nowe.

Oznaczymy nasze us ugi przez dodanie znaczników w ich konfiguracjach:

freegeoip_geocoder: class: Khepin\BookBundle\Geo\FreeGeoIpGeocoder arguments: [@geocoder] tags: - { name: khepin_book.geocoder }random_geocoder: class: Khepin\BookBundle\Geo\RandomLocationGeocoder tags: - { name: khepin_book.geocoder }

Nie mo emy ich wszystkich przekaza bezpo rednio w konstruktorze klasy, wi c dodamy doklasy UserLocator metod addGeocoder:

class UserLocator{ protected $geocoders = [];

protected $user_ip;

// St d usuni to geokoder. public function __construct(Request $request) { $this->user_ip = $request->getClientIp(); }

public function addGeocoder(Geocoder $geocoder) { $this->geocoders[] = $geocoder; }

// Wybiera najodpowiedniejszy geokoder. public function getBestGeocoder(){/* ... */}

// ...}

Nie mo na poinformowa DIC o ch ci dodania oznakowanych us ug tylko przez konfiguracj .Robi si to w czasie dzia ania kompilatora — podczas kompilacji DIC.

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

Symfony2. Rozbudowa frameworka

24

W przebiegach kompilatora mo na dynamicznie modyfikowa definicje us ug. Mo na to wy-korzysta dla us ug oznakowanych oraz do tworzenia pakietów w czaj cych dodatkowe funkcje,gdy jaki inny pakiet równie jest obecny i skonfigurowany. Oto przyk ad wykorzystaniaprzebiegu kompilatora:

namespace Khepin\BookBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;use Symfony\Component\DependencyInjection\Compiler \CompilerPassInterface;use Symfony\Component\DependencyInjection\Reference;

class UserLocatorPass implements CompilerPassInterface{ public function process(ContainerBuilder $container) { if (!$container->hasDefinition('khepin_book.user_locator')) { return; }

$service_definition = $container->getDefinition ('khepin_book.user_locator'); $tagged = $container->findTaggedServiceIds ('khepin_book.geocoder');

foreach ($tagged as $id => $attrs) { $service_definition->addMethodCall( 'addGeocoder', [new Reference($id)] ); } }}

Po potwierdzeniu, e us uga user_locator (tu przemianowana na khepin_book.user_locator)istnieje, wyszukujemy wszystkie us ugi z odpowiednim znacznikiem i modyfikujemy definicjus ugi khepin_book.user_locator w taki sposób, aby je adowa a.

Mo na zdefiniowa atrybuty znacznika. Dzi ki temu mogliby my na przyk ad zapisa dok adno ka degogeokodera w jego konfiguracji, a nast pnie w przebiegu kompilatora lokalizatorowi u ytkownika do-starczy najprecyzyjniejszy dekoder: tags:

- { name: khepin_book.geocoder, accuracy: 69 }

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

Rozdzia 1. • Us ugi i procedury nas uchowe

25

Gdy programista zdefiniuje konfiguracj YAML dla us ug, Symfony na podstawie tych infor-macji wewn trznie tworzy definicje us ug. Dzi ki dodaniu przebiegu kompilatora mo emy mody-fikowa te definicje w sposób dynamiczny. Definicje us ug s nast pnie buforowane, aby nietrzeba by o ponownie kompilowa kontenera.

Procedury nas uchuj ceProcedury nas uchuj ce realizuj implementacj wzorca projektowego Obserwator. We wzorcutym wybrany fragment kodu nie próbuje rozpocz wykonywania ca ego kodu, który powi-nien zosta wykonany w danym momencie. Zamiast tego powiadamia swoich obserwatorów, edoszed do pewnego punktu wykonywania, i mog oni przej kontrol , je li jest taka potrzeba.

W Symfony wzorzec Obserwator jest realizowany przez zdarzenia. Ka da klasa i funkcja mo ewyzwoli zdarzenie, gdy tylko uzna to za stosowne. Samo zdarzenie mo e by zdefiniowanew klasie. Dzi ki temu mo na przekaza wi cej informacji do obserwuj cego je kodu. Systemtak e zg asza zdarzenia w ró nych momentach obs ugi da . S to:

kernel.request — to zdarzenie ma miejsce przed dotarciem do kontrolera. Jestu ywane wewn trznie do zape niania danymi obiektu request.

kernel.controller — to zdarzenie ma miejsce bezpo rednio przed uruchomieniemkontrolera. Mo na je wykorzysta w celu zmiany kontrolera, który jest aktualniewykonywany.

kernel.view — to zdarzenie ma miejsce po wykonaniu kontrolera, je li kontrolerten nie zwróci obiektu response. Mo na je wykorzysta do zlecenia domy lnejobs ugi renderowania widoku przez Twig.

kernel.response — to zdarzenie ma miejsce przed wys aniem odpowiedzi. Mo naje wykorzysta do zmodyfikowania odpowiedzi przed jej wys aniem.

kernel.terminate — to zdarzenie ma miejsce po wys aniu odpowiedzi. Mo na jewykorzysta do wykonania czasoch onnych operacji, które nie musz generowaodpowiedzi.

kernel.exception — to zdarzenie ma miejsce, gdy system przechwycinieobs u ony wyj tek.

Doctrine tak e zg asza zdarzenia w czasie cyklu istnienia obiektu (np. przed zapisaniem lub po zapisaniu gow bazie danych), ale to ca kiem osobny temat. Wszystko na temat zdarze cyklu istnienia obiektów Doctrinemo na znale na stronie http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#reference-events-lifecycle-events.

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

Symfony2. Rozbudowa frameworka

26

Zdarzenia s niezwykle przydatne i dlatego b d u ywane jeszcze wiele razy w ró nych miej-scach tej ksi ki. Gdy udost pnia si rozszerzenia do Symfony innym programistom, zawszedobrym pomys em jest zdefiniowanie i wyzwalanie w asnych zdarze , które mog s u y jakow asno ciowe punkty rozszerze .

Teraz rozbudujemy przyk ad z poprzedniej cz ci rozdzia u, aby zobaczy , do czego mogprzyda si procedury nas uchuj ce.

W pierwszej cz ci zbudowali my stron internetow wy wietlaj c informacje o spotkaniachw okolicy miejsca przebywania u ytkownika. Teraz dodatkowo sprawimy, e informacje te b dfiltrowane zgodnie z preferencjami u ytkownika.

Aktualizujemy schemat, aby utworzy relacj „wiele do wielu” mi dzy u ytkownikami i spo-tkaniami:

// Entity/User.php/** * @ORM\ManyToMany(targetEntity="Meetup", mappedBy="attendees") */protected $meetups;// Entity/Meetup.php

/** * @ORM\ManyToMany(targetEntity="User", inversedBy="meetups") */protected $attendees;

W kontrolerze mamy prost akcj pozwalaj c wzi udzia w spotkaniu:

/** * @Route("/meetups/{meetup_id}/join") * @Template() */public function joinAction($meetup_id) { $em = $this->getDoctrine()->getManager(); $meetup = $em->getRepository('KhepinBookBundle:Meetup') ->find($meetup_id);

$form = $this->createForm( new JoinMeetupType(), $meetup, ['action' => '', 'method' => 'POST'] ); $form->add('submit', 'submit', array('label' => 'Join')); $form->handleRequest($this->get('request'));

$user = $this->get('security.context')->getToken()->getUser();

if ($form->isValid()) { $meetup->addAttendee($user);

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

Rozdzia 1. • Us ugi i procedury nas uchowe

27

$em->flush(); }

$form = $form->createView(); return ['meetup' => $meetup, 'user' => $user, 'form' => $form];}

U yli my formularza, mimo e ta akcja jest bardzo prosta, poniewa przesy anie wszystkich informacjiw adresie URL w celu zaktualizowania bazy danych i zarejestrowania u ytkownika jako uczestnika by o-by s abym punktem, nara aj cym aplikacj na wiele ataków, np. CSRF.

Aktualizowanie preferencji u ytkownikaprzy u yciu w asnych zdarzeChcemy napisa kod generuj cy now list ulubionych spotka u ytkownika. W tym celumusimy zmieni logik wy wietlania strony g ównej. B dziemy wy wietla nie tylko list spotkaz pobli a miejsca przebywania u ytkownika, ale dodatkowo przefiltrujemy dane wed ug pre-ferencji tego u ytkownika. Przewidujemy, e strona g ówna naszej aplikacji b dzie cz sto wy-wietlana, przez co wykonywanie wszystkich oblicze przy ka dym jej otwarciu mo e by

bardzo kosztowne. Dlatego lepiej b dzie utworzy gotow list ulubionych rodzajów spotka ,któr b dziemy modyfikowa , gdy u ytkownik zapisze si na jakie spotkanie lub zrezygnujez udzia u w jakim spotkaniu. W przysz o ci mo na te list t aktualizowa na podstawie przegl -danych stron, nawet je li u ytkownik nie zapisze si na dane spotkanie.

Teraz musimy zastanowi si , gdzie umie ci nasz kod. Narzuca si my l, aby wstawi go wprostdo kontrolera, chocia nie jest to w a ciwe miejsce. Zadaniem kontrolera jest zapewnienieu ytkownikowi zapisania si na spotkanie, i tak powinno pozosta .

Ale mo emy te wywo a w kontrolerze zdarzenie, które ostrze e wszystkich obserwatorów,e u ytkownik zapisa si na spotkanie. Decyzj , co zrobi z t informacj , pozostawimy ju

obserwatorom.

Aby to zdarzenie by o przydatne, musi zawiera dane o u ytkowniku i spotkaniu. Dlatego utwo-rzymy prost klas do przechowywania tych informacji:

// Bundle/Event/MeetupEvent.phpnamespace Khepin\BookBundle\Event;

use Symfony\Component\EventDispatcher\Event;use Khepin\BookBundle\Entity\User;use Khepin\BookBundle\Entity\Meetup;

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

Symfony2. Rozbudowa frameworka

28

class MeetupEvent extends Event{ protected $user; protected $event;

public function __construct(User $user, Meetup $meetup) { $this->user = $user; $this->meetup= $meetup; }

public function getUser() { return $this->user; }

public function getMeetup() { return $this->meetup; }}

Jest to bardzo prosta klasa, której jedynym zadaniem jest przechowywanie danych o zdarzeniudotycz cym spotkania i u ytkownika. Teraz spowodujemy wyzwolenie tego zdarzenia, gdy u yt-kownik zapisze si na jakie spotkanie. Wpisz poni szy kod w kontrolerze, za kodem sprawdzaj -cym formularz:

if ($form->isValid()) { $meetup->addAttendee($user); // To jest nowy wiersz. $this->get('event_dispatcher')->dispatch( 'meetup.join', new MeetupEvent($user, $meetup) ); $em->flush();}

Wystarczy o znale us ug event_dispatcher i rozes a zdarzenie meetup.join z porcj danych.Rozsy anie zdarzenia to po prostu wys anie wiadomo ci pod pewn nazw , w tym przypadkumeetup.join, z potencjalnymi danymi. Zanim kod przejdzie do wykonywania nast pnegowiersza, wszystkie klasy i obiekty nas uchuj ce tego zdarzenia równie mog wykona jakieinstrukcje.

Nazwy zdarze dobrze jest przyporz dkowywa do przestrzeni nazw, aby unikn ewentualnych kolizji.Zazwyczaj do oddzielania przestrzeni nazw zdarze u ywa si kropki i dlatego mo na spotka zdarzeniaw stylu acme.user.authentication.success, acme.user.authentication.fail itd.

Innym dobrym zwyczajem jest katalogowanie i dokumentowanie swoich zdarze . Z do wiad-czenia wiem, e je li dodaje si wiele zdarze , „bo tak atwo si je wyzwala, gdy to przecie

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

Rozdzia 1. • Us ugi i procedury nas uchowe

29

tylko nazwy”, to po pewnym czasie trudno je wszystkie zapami ta i atwo si pogubi , doczego s u . Katalogowanie zdarze nabiera szczególnego znaczenia, gdy kto planuje udost pniaswój kod innym programistom. Wówczas nale y utworzy statyczn klas zdarze :

namespace Khepin\BookBundle\Event;

final class MeetupEvents{ /** * Zdarzenie meetup.join jest wyzwalane, gdy u ytkownik * rejestruje si na spotkaniu. * * Procedury nas uchuj ce otrzymuj egzemplarz obiektu: * Khepin\BookBundle\Event\MeetupEvent */ const MEETUP_JOIN = 'meetup.join';}

Jak napisa em, klasa ta s u y jedynie do celów dokumentacyjnych. Kod w kontrolerze mo nazmieni nast puj co:

$container->get('event_dispatcher')->dispatch( MeetupEvents::MEETUP_JOIN, new MeetupEvent($user, $meetup));

Wiemy ju , jak wyzwoli zdarzenie, ale jak na razie, nie mamy z tej wiedzy wi kszego po yt-ku! Dodamy wi c troch wi cej kodu. Najpierw utworzymy klas nas uchuj c , która b dzieodpowiedzialna za generowanie dla u ytkownika nowej listy preferowanych spotka :

namespace Khepin\BookBundle\Event\Listener;use Khepin\BookBundle\Event\MeetupEvent;

class JoinMeetupListener{ public function generatePreferences(MeetupEvent $event) { $user = $event->getUser(); $meetup = $event->getMeetup(); // Kod generuj cy nowe preferencje u ytkownika. }}

Jest to zwyk a klasa PHP. Nie musi ona niczego specjalnego rozszerza , a wi c nie musi te miejakiej konkretnej nazwy. Najwa niejsze, eby zawiera a jedn metod przyjmuj c argumentMeetupEvent. Gdyby my teraz wykonali kod, nic by si nie sta o, poniewa jeszcze nie powie-dzieli my, e ta klasa ma nas uchiwa jakichkolwiek zdarze . W tym celu musimy zamieni jw us ug . Oznacza to, e naszej procedurze nas uchowej b dzie mo na przekaza egzemplarzus ugi geolokacyjnej, któr zdefiniowali my w pierwszej cz ci rozdzia u, lub dowolnej innej us ugidost pnej w Symfony. Ponadto w definicji naszej procedury jako us ugi zaobserwujemy tebardziej zaawansowane techniki u ycia us ug:

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

Symfony2. Rozbudowa frameworka

30

join_meetup_listener: class: Khepin\BookBundle\Event\Listener\JoinMeetupListener tags: - { name: kernel.event_listener, event: meetup.join, method: generatePreferences }

Sekcja tags oznacza, e przy pierwszym utworzeniu us ugi event_dispatcher zostan wyszu-kane i zapami tane tak e inne us ugi, którym przypisano okre lony znacznik (w tym przypad-ku kernel.event_listener). Jest to wykorzystywane równie przez inne sk adniki Symfony,np. system formularzy (omówiony w rozdziale 3.).

Poprawianie wydajno ciOsi gn li my pewien cel przy u yciu zdarze i procedur nas uchuj cych. Ca a logika doty-cz ca obliczania preferencji u ytkownika znajduje si w osobnej klasie nas uchowej. Nie przed-stawi em szczegó owo implementacji tej logiki, ale wiadomo ju , e najlepiej wynie j pozakontroler i przekszta ci w niezale n us ug z mo liwo ci wywo ywania w procedurze nas u-chuj cej. Im wi cej b dziesz u ywa Symfony, tym bardziej oczywiste b dzie Ci si to wydawa .Ca y kod, który mo na przenie do us ugi, nale y przenie do us ugi. Niektórzy programi cirdzenia Symfony twierdz , e nawet kontrolery powinny by us ugami. Je li zastosujesz sido tych wskazówek, Twój kod b dzie atwiejszy do testowania.

Kod dzia aj cy po odpowiedziGdy witryna stanie si bardziej skomplikowana i b dzie mia a du o u ytkowników, obliczeniapreferowanych typów zdarze u ytkowników mog si d u y . Poza tym u ytkownik mo e mieprzyjació na naszej stronie, w zwi zku z czym chcieliby my, aby jego wybory mia y wp ywtak e na preferencje jego znajomych.

W nowoczesnych aplikacjach sieciowych cz sto nie trzeba czeka na zako czenie czasoch onnychoperacji, zanim zostanie zwrócona odpowied do u ytkownika. Oto niektóre z takich przypadków:

Po wys aniu filmu na serwer u ytkownik nie powinien czeka na zako czeniekonwersji tego filmu na inny format, a pojawi si strona z informacj , e wysy aniezako czy o si pomy lnie.

Kilka sekund mo na zyska , je li nie b dzie si zmienia rozmiaru obrazu profilowegou ytkownika przed wy wietleniem informacji, e aktualizacja si powiod a.

W naszym przypadku u ytkownik nie powinien czeka na potwierdzenie, aroze lemy wszystkim jego znajomym informacj , e zapisa si na jakie spotkanie.

Problemy te mo na rozwi za na wiele sposobów, aby odci y proces generowania odpowiedzi.Mo na codziennie oblicza preferencje u ytkownika za pomoc procesów wsadowych, ale tospowoduje opó nienia w zwracaniu odpowiedzi, poniewa aktualizacje b d wykonywanetylko raz dziennie, oraz mo e to prowadzi do marnowania zasobów. Mo na te u y kolejkiwiadomo ci i robotników w taki sposób, e kolejka powiadamia aby robotników o konieczno ci

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

Rozdzia 1. • Us ugi i procedury nas uchowe

31

zrobienia czego . By oby to co podobnego do rozwi zania ze zdarzeniami, ale kod wykonuj -cy obliczenia dzia a by w innym procesie, a mo e nawet na innej maszynie. Nie trzeba byby o te czeka na jego zako czenie, aby móc kontynuowa .

W Symfony problem ten mo na atwo rozwi za , pozostaj c ca y czas w systemie. Nas uchu-j c zdarzenia kernel.terminate, mo emy uruchomi metod naszej procedury nas uchuj cejpo tym, jak odpowied zostanie wys ana do klienta.

Zmienimy nasz kod, aby skorzysta z tej mo liwo ci. Nasza nowa procedura nas uchuj ca b dzieteraz zachowywa si tak, jak napisano w poni szej tabeli:

Zdarzenie Procedura nas uchuj ca

meetup.join Zapami tuje u ytkownika i spotkanie na pó niej. Brak jakichkolwiek oblicze .

kernel.terminate Generuje preferencje u ytkownika. Wykonuje obliczenia.

Nasz kod powinien teraz wygl da tak:

class JoinMeetupListener{ protected $event;

public function onUserJoinsMeetup(MeetupEvent $event) { $this->event = $event; }

public function generatePreferences() { if ($this->event) { // Generuje nowe preferencje u ytkownika. } }}

Nast pnie musimy te zmieni konfiguracj , aby wywo ywa a generatePreferences w przy-padku wyst pienia zdarzenia kernel.terminate:

join_meetup_listener: class: Khepin\BookBundle\Event\Listener\JoinMeetupListener tags: - { name: kernel.event_listener, event: meetup.join, method: onUserJoinsMeetup } - { name: kernel.event_listener, event: kernel.terminate, method: generatePreferences }

Wystarczy o doda znacznik do istniej cej procedury nas uchowej. Je li rozwa a e utworze-nie nowej us ugi tej samej klasy, tylko nas uchuj cej innego zdarzenia, teraz b dziesz miedwa ró ne egzemplarze us ugi. W zwi zku z tym us uga, która zapami ta a zdarzenie, nigdy

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

Symfony2. Rozbudowa frameworka

32

nie zostanie wywo ana w celu wygenerowania preferencji, a us uga wywo ana w celu wygene-rowania preferencji nigdy nie otrzyma zdarzenia do pracy. Dzi ki tej nowej konfiguracji kodwykonuj cy intensywne obliczenia nie przeszkadza ju w wysy aniu odpowiedzi do u ytkow-nika, który mo e cieszy si komfortowym przegl daniem stron.

PodsumowanieW niniejszym rozdziale zosta y wprowadzone dwa podstawowe poj cia systemu Symfony,zw aszcza je li chodzi o tworzenie rozszerze . Na przyk adzie geokodowania dowiedzia esi , jak atwo dodaje si us ugi podobne do standardowych us ug systemu. Ponadto pokaza em, jakza pomoc zdarze odpowiednio rozdysponowa logik programu, aby nie za mieci kontro-lerów niechcianym kodem. Na zako czenie przy u yciu zdarze przyspieszyli my dzia aniewitryny i uczynili my przegl danie stron bardziej komfortowym.

Mo esz wierzy lub nie, ale je li dobrze zrozumiesz dzia anie zdarze i us ug, to b dzieszwiedzie prawie wszystko na temat rozszerzania Symfony. W dalszej cz ci ksi ki b dziemywielokrotnie wraca do tych dwóch poj , a wi c jest bardzo wa ne, aby je dobrze zrozumie .

W nast pnym rozdziale dodamy nowe polecenia do narz dzia konsolowego Symfony oraz do-stosujemy do swoich potrzeb silnik szablonów. W tym równie bardzo pomocne b d us ugi.

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

Skorowidz

Aabstrakcyjna definicja us ugi, 72ACL, access control list, 74adnotacja, 74, 80

@Annotation, 80@ORM\Version, 99

aktualizowaniepreferencji u ytkownika, 27wersji, 100

API, 85aplikacja GitHub, 110atak typu CSRF, 27, 87atrapy klas, 19atrybuty znacznika, 24autoryzacja, 63, 74awatar, 33

Bbaza danych

MongoDB, 89, 90MySQL, 89PostgreSQL, 89

bezpiecze stwo, 63biblioteka Imagine, 34b d, 44

Ddane

u ytkowników, 56zdarzenia, 62

definiowanieadnotacji, 80us ugi, 24

DIC, dependency injection container, 17Doctrine, 25, 89dodawanie

adnotacji, 82mapy do widoku, 51pól, 60

dokumentacja, 116dokumentowanie zdarze , 28dostawca u ytkowników, 68dost p do geokodera, 15dystrybucja, 118dziedziczenie us ugi, 72

Ffabryka zabezpiecze , 68, 108filtr, 103

ró nicy czasowej, 44formularz, 27, 47

jako us uga, 56funkcja

buildView(), 56configure(), 34execute(), 34parse(), 96

Ggeokoder, 21geolokalizacja, 14

Hhas o, 67

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

Skorowidz

122

Iinicjacja geokodowania, 15integracja z mapami Google, 48interfejs

API, 85do us ug, 38Geocoder, 21PHP, 104UserOwnedEntity, 104VoterInterface, 75

Jjednostka robocza, 101

Kklasa

adaptacyjna, 16Address, 58adnotacyjna, 80AuthenticationListener, 68, 110AuthenticationProvider, 71BaseController, 17Coordinate, 48, 55dostawcza, 16Form, 57geokodowania, 16KhepinGitAuthBundle, 108OwnerFilter, 105PHPUnit_Framework_TestCase, 19, 37Token, 67Type, 51, 90UserLocator, 19UserProvider, 68, 73Voter, 75WebTestCase, 19, 37

kod dzia aj cy po odpowiedzi, 30kompilacja DIC, 23konfiguracja

formularza, 49ORM, 104

konsola, 36kontener wstrzykiwania zale no ci, 17kontrola wersji, 97

Llicencja MIT, 119licencjonowanie, 118lista

kontroli dost pu, 74pakietów, 116

lokalizacja predefiniowana, 55

Mmapowanie, 92

obiektowo-relacyjne, 89mapy Google, 47metoda

attemptAuthentication, 66closureToDatabase, 90closureToPHP, 90, 91convertToDatabaseValue, 90convertToPHPValue, 90createView, 51get*Annotations, 82getClass, 82getForm, 51getKey, 70getUserCoordinate, 57prePersist, 99preUpdate, 99reverseTransform, 54supportClass, 75supportsAttribute, 75Trait, 98transform, 54vote, 75

modyfikowanie formularza, 60, 61

Nnarz dzia

do geokodowania, 14do testowania, 117

narz dziedo mapowania obiektowo-relacyjnego, 89Mockery, 117

nazwa przestrzeni nazw, 108nazwy zdarze , 28

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

Skorowidz

123

Oodczytywanie adnotacji, 82ODM, object-document mapper, 89ODM Mongo, 92opcja compound, 50ORM, 89

Ppakiet

FOSUserBundle, 72ODM Mongo, 92SensioFrameworkExtraBundle, 82

parser, 95plik

bootstrap.php, 117config.yml, 19, 94, 109Configuration.php, 113Extension.php, 113phpunit.xml, 117README, 116routing.yml, 66

pliki zabezpiecze , 72polecenia, 33

jako interfejs do us ug, 38polecenie picture:resize, 37procedura nas uchuj ca uwierzytelniania, 66procedury nas uchuj ce, 25, 62przekszta canie danych, 54przestrze nazw, 108

Rrelacja wiele do wielu, 26reprezentacje danych, 54rozmiar obrazów, 34

Ssekcja tags, 30serwer relacyjnych baz danych, 10serwis GitHub, 64, 66sk adnia funkcji DQL, 96skrypt, 41struktura pakietu, 108system

sqlite, 101Symfony, 10szablonów Twig, 40

szablony Twig, 40

Ttechnologia OAuth, 64testowanie

bazy danych, 101mapowania, 92pakietu, 116polecenia, 37rozszerze Twig, 43us ug, 19

token, 68, 72token DISTANCE, 95transformatory danych, 54Twig, 40, 41

rozszerzenia, 40testowanie rozszerze , 43

tworzeniefiltra Doctrine, 103formularzy, 47map, 51pakietu, 107, 113w asnych typów danych, 89

Uudost pnianie

konfiguracji, 110pakietu, 116w asnych rozszerze , 107

uprawnienia szczegó owe, 75us uga, service, 13

event_dispatcher, 28fos_user.user_manager, 38geolokalizacji, 14, 29ivory_google_map.map, 51shrinker, 39user_locator, 24, 56, 57

us ugi domy lne, 13ustawianie wersji, 99usuwanie pól, 60uwierzytelnianie, 63

OAuth poprzez GitHub, 64u ywanie

mapy, 51wersji, 100

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

Skorowidz

124

VVotery, 75

WWalker AST, 103warstwa abstrakcji baz danych, 97wersjonowanie, 100weryfikowanie poprawno ci pakietu, 113wid et wy wietlaj cy map , 47, 50wiersz polece Composera, 33w asne

funkcje DQL, 93funkcje SQL, 93rozszerzenia, 107typy danych, 89zdarzenia, 27

wspó rz dne geograficzne, 47wstrzykiwanie zale no ci, 17wydajno , 30wyj tek, 51wy wietlanie

listy us ug, 13formularza, 59pyta , 36

wyzwalanie zdarze , 26wzorzec Obserwator, 25wzór na odleg o punktów, 93

Zzabezpieczanie

API, 85kontrolerów, 83

zakrescontainer, 18prototype, 18, 51request, 18

zapora ogniowa, 65, 68zarz dzanie skryptami, 41zdarzenia w asne, 27zdarzenie

kernel.controller, 25kernel.exception, 25kernel.request, 25, 105kernel.response, 25kernel.terminate, 25, 31kernel.view, 25loadClassMetadata, 98meetup.join, 31onClear, 98post*, 98POST_SET_DATA, 57POST_SUBMIT, 57postFlush, 98postLoad, 98PRE_SET_DATA, 56PRE_SUBMIT, 57prePersist, 98preRemove, 98preUpdate, 98SUBMIT, 57

zmiany w tokenie, 71zmienianie rozmiaru obrazów, 34znacznik <script>, 42znakowanie us ug, 21

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