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