SW-lab3

Transkrypt

SW-lab3
Mechanizm routingu
URL, URI – różnice i podobieństwa
 URL (Uniform Resource Locator) – unikalny identyfikator wskazujący
lokalizację zasobu sieciowego.
 URI (Uniform Resource Identyficatior) – unikalny identyfikator zasobu
sieciowego.
Standardowo URI strony www (np. http://www.onet.pl) jest utożsamiany
z jej URL.
Przykładowe URI (tożsame z URL)
http://tjach.pl/systemy-wielowarstwowe/
http://www.google.com/search?q=systemy+wielowarstowe&ie=utf8&oe=utf-8
Rozróżnienie URI i URL jest istotne m. in. z punktu widzenia tzw. sieci
semantycznej (Semantic Web). Wiedza ludzka powinna być zapisana w
ustandaryzowanym formacie, a każdy zapis ma swój jednoznaczny
identyfikator, odnoszący się do bytów rzeczywistych i abstrakcyjnych.
Przetwarzanie URL z punktu
widzenia platformy Symfony
 URL – interfejs zasób <=> użytkownik
Wady tradycyjnych URL:
o Link postaci test.pl/?id=5&shva=1 nie mówi nic na temat zasobu
na jaki wskazuje.
o Ujawniają wewnętrzną strukturę aplikacji – możliwe ryzyko
bezpieczeństwa.
Mechanizm routingu – dedykowany framework wbudowany w
Symfony, służący zarządzaniu wewnętrznymi i zewnętrznymi
URL’ami.
Gdy przychodzi żądanie wyświetlenia danej strony mechanizm
routingu parsuje URL’a i konwertuje go na wewnętrzny
identyfikator URI.
/ad/show/id/1
ad/show?id=1
Format URI
 Generalnie wewnętrzne URI są projektowane według
następującego wzorca:
MODULE/ACTION?key=value&key_1=value_1&...
W przykładowym URI:
/ad/show/id/1
ad – nazwa modułu,
show – nazwa akcji,
id/1 - parametr
Routing jest mechanizmem dwukierunkowym – zmiana
URLi nie niesie ze sobą konieczności zmiany wewnętrznej
implementacji URI.
W szablonie index.html.twig:
{{ path('ens_job_show', { 'id': entity.id }) }}
Konfiguracja routingu
 Przyporządkowanie URI  URL jest definiowane w pliku konfiguracyjnym
routing.yml. Plik ten opisuje tzw. ścieżki.
 Każda ścieżka ma swoją nazwę (np. ens_stud_ad_homepage), wzorzec w
postaci wyrażenia regularnego i ewentualne parametry (/hello/{name}).
 Podczas żądania dostępu do zasobu, mechanizm routingu próbuje dopasować
wzorzec do adresu URL.
 Kolejność ścieżek jest bardzo ważna!
Pierwsza ścieżka która zostanie dopasowana – wygrywa.
ścieżki
Proszę sprawdzić co robi: http://localhost:8080/hello/Tomek
Wyszukiwanie odpowiedniej
ścieżki
Routing w środowisku developerskim
Proszę zmodyfikować plik app/config/routing_dev.yml aby
wyglądał następująco:
Zmiana domyślnej strony głównej
 Proszę modyfikować plik
src\Ens\StudAdBundle\Resources\config\routing.yml, aby
wskazywał na stworzony uprzednio moduł ad:
Drobne poprawki w szablonie…
 Zmieniamy
src/Ens/StudAdBundle/Resources/views/layout.html.twig by
korzystał z nowej ścieżki:
 Zmienimy adresy w formacie:
http://localhost:8080/ens_ad/show/id/1
na bardziej przyjazny zapis:
http://localhost:8080/ens_ad/Katowice-Polska/1/Sprzedam-dyplom
czyli chcemy adres w formacie:
/ens_ad/{location}/{id}/{name}
Zmiana adresów
\src\Ens\StudAdBundle\Resources\config\routing\ad.yml
Zmodyfikuj szalbon
\src\Ens\StudAdBundle\Resources\views\Ad\index.html.twig
dodając uwzględnione w ścieżce parametry w funkcji path:
Proszę sprawdzić zmiany w adresie url, klikając na szczegóły
wybranego ogłoszenia
Przyjazne
adresy
URL
c.d.
 Rozwiązanie prawie działa. Ale zamiast:
http://localhost:8080/app_dev.php/ens_ad/Katowice-Polska/1/Sprzedam-dyplom
jest
http://localhost:8080/app_dev.php/ens_ad/Katowice, Polska/1/Sprzedam dyplom
Wynika to z występowania spacji w tytule ogłoszenia „Sprzedam dyplom”.
Dlatego należałoby stworzyć funkcję naprawczą, która zamieni
wszystkie znaki nie będące literami bądź cyframi znakiem myślnika (-).
Proszę otworzyć plik \src\Ens\StudAdBundle\Entity\Ad.php i dopisać
następujące funkcje:
Dopisz również przed definicją klasy:
Przyjazne adresy URL c.d.
Proszę utworzyć plik src\Ens\StudAdBundle\Utils\Naprawiacz.php
z następującą zawartością:
I wszystko powinno działać jak należy.
Walidacja ścieżek
 System routingu ma wbudowane mechanizmy do walidacji
URL. Każda zmienna zdefiniowana we wzorcu może zostać
poddana walidacji wykorzystując wyrażenia regularne.
Odpowiada za to sekcja requirements.
 Powyższy zapis narzuca wymaganie, aby zmienna id była
typu numerycznego. W przeciwnym wypadku ścieżka nie
zostanie dopasowana i następuje próba analizy wzorca
innej ścieżki.
Ufff.. Routing omówiony...
Zmiany w logice aplikacji - ogłoszenia
Zmiany w logice działania aplikacji – ogłoszenia nie starsze
niż
30 dni
 Aktualnie wszystkie ogłoszenia są wyświetlane
 Ogłoszenia nie starsze niż 30 dni
Naprawiamy dodawanie ogłoszeń
 Proszę dokonać zmian w layout.html.twig:
 Oraz zmian w AdControler.php:
Debug zapytań SQL
 Będąc w środowisku developerskim, uzupełniają się automatycznie logi
odnośnie wszelkich działań w aplikacji, w tym widoczne są wszelkie
zapytania SQL kierowane do odpowiedniego systemu bazodanowego.
 Wszelkie dzienniki znajdują się w katalogu /log.
 Znak ? w zapytaniu oznacza, że Doctrine jest odpowiedzialne za
podstawienie tam rzeczywistej wartości w bezpieczny sposób.
 Można korzystać też z paska logów - szybciej:
Tylko aktywne ogłoszenia
 Zmiany w ORM – autouzupełnianie pola createdAt:
 Przebudowa ORM:
symfony doctrine:generate:entities EnsStudAdBundle
 Jakie wpisać zapytanie, aby tylko aktywne ogłoszenia były widoczne
(wykorzystując dane zawarte w expires_at?)
 Trzeba dokonać edycji nowej funkcji w
src/Ens/StudAdBundle/Entity/Ad.php
Tylko aktywne ogłoszenia c.d.
 Już prawie koniec. Jeszcze tylko faktyczna zmiana w kontrolerze:
Proszę sprawdzić działanie, dodając ogłoszenie, z odpowiednią datą.
Refactoring – czyli naprawiamy
MVC
 Poprzedni kod działa dobrze, ale miesza warstwy kontrolera i modelu
(obiekt Doctrine_Query należy do modelu).
 Należy stworzyć zatem dodatkową metodę w warstwie ORM
src\Ens\StudAdBundle\Resources\config\doctrine\Ad.orm.yml:
 Oraz przebudować warstwę ORM:
symfony doctrine:generate:entities EnsStudAdBundle
Refactoring – czyli naprawiamy
MVC c.d.
 Teraz trzeba dodać nową metodę getActiveAds do
src\Ens\StudAdBundle\Repository\AdRepository.php:
Refactoring – czyli naprawiamy
MVC
 Na koniec wprowadzić poprawki do kontrolera:
 I przetestować czy wszystko działa jak wcześniej.
Wyświetlanie kategorii ogłoszeń na
stronie głównej
 Podobnie jak wcześniej, trzeba zmodyfikować ORM, tym
razem jednak dla Category.orm.yml:
 Przeładować:
symfony doctrine:generate:entities EnsStudAdBundle
 Dodać nową metodę:
Przygotowanie do wyświetlania kategorii
 Zmienić kontroler odpowiednio:
 Ale żeby to wszystko działało musimy
dodać nową właściwość do klasy
src/Ens/StudAdBundle/Entity/Category.
php
Modyfikacja szablonu - kategorie
Testujemy zmiany
 Proszę z poziomu phpMyAdmina dodać dwie
kategorie.
 Ponadto dokonać zmian w klasie
src/Ens/StudAdBundle/Entity/Category.php
dodając metodę:
 Oraz dodać ogłoszenie…
Limitowanie rezultatów – 10
ogłoszeń na stronę
 Należy zmodyfikować funkcję getActiveAds() z klasy
AdRepository w sposób następujący:
Limitowanie rezultatów c.d.
 Dodatkowo należy zmienić AdControler:
 Ale wówczas liczba rezultatów na stronę zostanie
ustawiona na stałe (10). Dobrze jest więc zdefiniować
parametr globalny w pliku app/config/config.yml
Limitowanie rezultatów c.d.
 Jednakże trzeba jeszcze nieco zmodyfikować kontroler
by brał pod uwagę wprowadzony parametr:
Zabezpieczenie dostępu do
nieaktywnych ogłoszeń
 Znając link do nieaktywnego ogłoszenia nadal można je podejrzeć. Aby to
naprawić, zostanie stworzona nowa funkcja w AdRepository.php:
Zabezpieczenie dostępu do
nieaktywnych ogłoszeń c.d.
 Teraz jeszcze tylko drobna zmiana w kontrolerze (by korzystał ze
wprowadzonej funkcji):
Poprawny efekt działania
Zmiany w logice aplikacji - kategorie
Wyświetlanie wszystkich ogłoszeń z
danej kategorii – licznik
 Chcąc wyświetlić wszystkie ogłoszenia z danej kategorii dobrze jest
zrobić osobną ścieżkę do tego celu:
 Widać, że trzeba będzie zaprojektować nowy moduł oraz stworzyć
wirtualny akcesor (bo takiego pola nie ma w bazie danych) dla
zmiennej nazwapopraw. Edytujemy więc plik
src/Ens/StudAdBundle/Entity/Category.php:
Wyświetlanie linku do kategorii – modyfikacja szablonu
 Aby dodać link, który będzie się wyświetlał jeśli w danej kategorii jest więcej
niż 10 dokumentów edytujemy szablon index.html.twig:
http://www.tomaszx.pl/materialy/sf_index.html.twig
Modyfikacja ORM Category.php
 Dodajemy do pliku
src/Ens/StudAdBundle/Entity/Category.php pole more_ads
oraz akcesor i modyfikator:
 Pozostaje jeszcze wprowadzenie zmian w kontrolerze ogłoszeń:
Zmiany w AdController.php
 Wywołano metodę countActiveAds(), którą trzeba zdefiniować…
Definicja countActiveAds
src/Ens/StudAdBundle/Repository/AdRepository.php
Szybki test zmian
Tworzymy moduł dla kategorii
 Aby stworzyć moduł można skorzystać z
doctrine:generate:crud, ale w tym przypadku lepiej
zrobić to ręcznie:
src/Ens/StudAdBundle/Controller/CategoryController
 Zmieńmy plik
Resources/config/doctrine/Category.orm
.yml w sposób następujący:
Edycja bazy danych
Edycja bazy danych c.d.
 Usuwamy metodę getNazwapopraw() z /Entity/Category.php.
 Aktualizujemy ORM komendą:
symfony doctrine:generate:entities EnsStudAdBundle
 Implementujemy metodę setNazwapoprawValue():
 Robimy kopie zapasową danych bazy (phpMyAdmin).
 Uaktualniamy bazę danych:
symfony doctrine:database:drop --force
symfony doctrine:database:create
symfony doctrine:schema:update -–force
 Wpisujemy nowe przykładowe dane.
Tworzenie strony z kategoriami
 Aktualizujemy pusty kontroler:
Tworzenie szablonu show.html.twig
src\Ens\StudAdBundle\Resources\views\Category
Podział listy kategorii na strony
 Spróbujmy podzielić wszystkie kategorie na 20 per
stronę.
 Zmiany w Resources/config/routing.yml:
 Zmiany w konfiguracji app/config/config.yml:
Modyfikacja getActiveAds
src/Ens/StudAdBundle/Repository/AdRepository.php
Dostosowanie
kontrolera
kategorii
 Dodanie metody getActiveAdsQuery() spowodowało, że można
również dokonać refactoringu metod getActiveAds() oraz
countActiveJobs(), aby korzystały z nowostworzonej.
 Teraz trzeba jeszcze tylko zaktualizować szablon.
Szablon showSuccess.php
 Proszę uaktualnić szablon znajdujący się w pliku
src\Ens\StudAdBundle\Resources\views\Category
\show.html.twig zgodnie z zawartością podaną w
materiałach
 Należy dokonać ewentualnych zmian jeżeli nie została
zachowana konwencja nazewnicza stosowana na
zajęciach.
 Następnie proszę sprawdzić, czy dodana
funkcjonalność działa jak należy (kategorie się
właściwie wyświetlają)
Test zmian
Ćwiczenie
 Proszę dołożyć pliki stylu, oraz zmienić na tej podstawie wygląd
wszystkich stron aplikacji. Jeśli zajdzie taka potrzeba zmodyfikuj
odpowiednie pliki *.php
 Wymagania:
 Na stronie z ogłoszeniami oraz po wejściu do danej kategorii ma się
wyświetlać jedynie tytuł ogłoszenia, jego skrócona treść (do np. 50
znaków) oraz data ważności. Liczba wyświetlanych znaków treści ma
być modyfikowalna w pliku konfiguracyjnym aplikacji.
 Po kliknięciu na nazwę danego ogłoszenia, mają się wyświetlić
szczegóły z nim związane (Nazwa, słowna kategoria do której
przynależy, pełny opis, mail, telefon, strona www, data utworzenia oraz
data ważności), dokładnie w tej kolejności.
 Proszę popracować nad samym wyglądem tych stron. Mile widziane:
zmiana koloru tła wiersza tabeli w zależności od tego czy to wiersz
parzysty czy nieparzysty, odpowiednie odstępy między polami,
odpowiednio dobrana czcionka (pogrubienie, krój czcionki). Podobnie
proszę zmienić wygląd strony do Edytowania/Dodawania nowych
ogłoszeń.