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ń.