Wprowadzenie do framework a Symfony
dr Tomasz Jach WWW: E-mail: Adres: Instytut Informatyki ul. Będzińska 39 41-200 Sosnowiec Pokój 214 Telefon: 32 3689765 Zaliczenie zajęć: kolokwium + projekt + praca na zajęciach. Obecność na zajęciach obowiązkowa.
Warunki zaliczenia i tematyka zajęć Projekt na zajęciacj napisanie własnego projektu opartego na frameworku Symphony 2 kolokwia na zajęciach. Ocena końcowa: Round[(3*K1 + 3*K2 + 1*P) / 7]
Plan zajęć Symphony: Model MVC Instalacja Projektowanie serwisu Routing i przyjazne URL e Formularze Generator backendu Mechanizm logowania i zabezpieczeń Testowanie Polonizacja, wyszukiwanie i pluginy
Literatura Wszystkie pozycje dostępne online: http://symfony.com/doc/current/index.html Book, Cookbook, Reference, itp. Jobeet Tutorial with Symfony2: http://www.ens.ro/2012/03/21/jobeet-tutorial-withsymfony2/
Od czego zacząć edytor http://www.jetbrains.com/phpstorm/
Od czego zacząć serwer zewnętrzny Na pewnym etapie przyda się zewnętrzny hosting. Ofert jest w bród, także bezpłatnych. Na co zwracać uwagę przy wyborze? Cena Gdzie fizycznie jest serwerownia (pingi!) Czy support działa w nocy i w weekendy? Dostęp do zarządzania domeną (np. cpanel) Możliwości (np. cron, catch-all na pocztę, dostęp przez SSH, itp.)
Ćwiczenie 1 1. Zainstaluj XAMPPa: http://sourceforge.net/projects/xampp/ 2. Zainstaluj PHP Storm: http://www.jetbrains.com/phpstorm/ 3. Stwórz nowy projekt (pusty) 4. Skonfiguruj serwer lokalny 1. Ewentualnie doinstaluj Visual C++ Redistributable for Visual Studio 2012 x86 or x64. 2. Wystartuj z panelu kontrolnego Apache, MySQL 3. File -> Settings -> PHP 1. PHP Language Level: taki jak w XAMPP (zwykle 5.5) 4. Interpreter -> -> 1. Name: PHP w XAMPP 2. PHP Home: C:\xampp\php (ACHTUNG: jak zmieniłeś ścieżkę instalacyjną, to tu ją wpisz) 5. Files -> Settings -> Deployment -> + 1. Name: Lokalny 2. Type: Local or mounted folder 3. Folder: C:\xampp\htdocs 4. Zakładka Mappings: Jak na rysunku
Tak to ma wyglądać
Tak to ma wyglądać
Tak to ma wyglądać
Ćwiczenie 1 5. View -> Tool Windows ->Database -> + -> Data Source -> MySQL 1. User: root 2. Pass: <puste> 3. ACHTUNG: Nie zapomnij o kliknięciu na Download driver files Pełny tutorial: http://confluence.jetbrains.com/display/phpstorm/installing+and+configuring+xamp P+with+PhpStorm+IDE
Tak to ma wyglądać
Mój pierwszy projekt
Ćwiczenie 1 Proszę napisać skrypt w języku PHP, którego celem jest wyświetlenie informacji z bazy danych. Proszę stworzyć jedną tabelę, zawierającą sztucznie stworzone informacje na wybrany przez Państwa temat i wyświetlić je na stronie w formie tabelarycznej (znaczniki <table><tr><td>). Proszę korzystać i zapoznać się z edytorem. Przykładowo, bazę danych można stworzyć bezpośrednio z PHP Storm.
Cechy platformy Symfony Bazuje na wzorcu projektowym MVC Niezależność od systemu bazodanowego Programowanie zorientowane obiektowo Łatwość w instalacji oraz konfiguracji na większości platform Zgodność z najlepszymi standardami oraz wzorcami budowy aplikacji internetowych Walidacja formularzy i treści Wbudowany mechanizm zarządzanie sesjami Łatwość rozbudowy oraz możliwość integracji z innymi bibliotekami Wykorzystanie technologii scaffoldingu. Wbudowana internacjonalizacja (i18n) Wbudowana ochrona przed atakami CSRF oraz XSS
Kiedy stosowanie Symfony się opłaca? Jeśli tworzymy prostą aplikację/stronę internetową składającą się z kilku(nastu) podstron, korzystającą w niewielkim stopniu z bazy danych, bez konieczności tworzenia szczegółowej dokumentacji lepiej jest wykorzystać zwykłe PHP. Jeśli tworzona aplikacja jest bardziej złożona, posiada rozbudowaną warstwę reguł biznesowych i będzie potencjalnie w przyszłości wzbogacana o nowe możliwości zaleca się skorzystać z platformy Symfony.
Object-Relational Mapping (ORM) ORM interfejs, którego zadaniem jest tłumaczenie logiki obiektowej na logikę relacyjną (by posługiwać się relacyjnymi bazami danych w sposób obiektowy). ORM składa się z obiektów definiujących metody dostępu do danych oraz pozwalających zapisać reguły biznesowe (np. automatyczne doliczanie rabatu). Warstwa pośrednicząca = oderwanie od konkretnego silnika bazodanowego Możliwość definiowania nowych akcesorów: public function getdane() { return $this->getimie().' '.$this->getnazwisko(); } Symfony wspiera domyślnie dwa ORMy: Propel oraz Doctrine.
Rapid Application Development (RAD) Rozpocznij tworzenie tak szybko jak to możliwe Proces iteracyjny Aplikuje filozofie KISS (Keep It Simple, Stupid) Częsty refactoring Wykorzystanie testów modułów Zasada DRY (Don t Repeat Yourself)
YAML Ain't Markup Language YAML uniwersalny język formalny przeznaczony do reprezentowania różnych danych w ustrukturalizowany sposób. Przykład: PHP $house = array( family' => array( 'name' => 'Doe', 'parents' => array('john', 'Jane'), 'children' => array('paul', 'Mark', 'Simone') ), 'address' => array( 'number' => 34, 'street' => 'Main Street', 'city' => 'Nowheretown', 'zipcode' => '12345' ) ); YAML house: family: name: Doe parents: - John - Jane children: - Paul - Mark - Simone address: number: 34 street: Main Street city: Nowheretown zipcode: "12345"
Którą wersję symfony wybrać? Symfony 1.3 / 1.4 Posiadają taką samą funkcjonalność. Wersja 1.4 nie jest kompatybilna z projektami utworzonymi w Symfony 1.2 i niższej. Wsparcie dla Symfony 1.3 zakończyło się w listopadzie 2010. Wsparcie dla Symfony 1.4 przewidywane jest do Listopada 2012. Symfony 2.0+ Inna struktura katalogów (inne znaczenie katalogu app/ i src/) Zmiana w sposobie automatycznego ładowania klas (nazwa klasy musi być odwzorowana w jej ścieżce) Zmiana w korzystaniu z konsoli (zamiast php symfony jest php app/console) Zmiana roli aplikacji (w jedynce jeden projekt posiadał wiele aplikacji, w dwójce projekt ma jedną aplikacje) Pluginy zostały zastąpione przez tzw. Bundle. Zmiany w zastosowaniu routingu i konfiguracji pluginów. Wprowadzone dystrybucje: standard, HelloWorld
Wzorzec MVC
<?php // Łączenie i wysyłanie zapytania $link = mysql_connect('localhost', 'myuser', 'mypassword'); mysql_select_db('blog_db', $link); $result = mysql_query('select date, title FROM post', $link);?> <html> <head> <title>list of Posts</title> </head> <body> <h1>list of Posts</h1> <table> <tr><th>date</th><th>title</th></tr> <?php // Wyświetlanie rezultatów while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; printf("\t\t<td> %s </td>\n", $row['date']); printf("\t\t<td> %s </td>\n", $row['title']); echo "\t</tr>\n"; }?> </table> </body> </html> <?php mysql_close($link);?> MVC Przykład: płaskie PHP na
<?php // Łączenie i wysyłanie zapytania $link = mysql_connect('localhost', 'myuser', 'mypassword'); mysql_select_db('blog_db', $link); $result = mysql_query('select date, title FROM post', $link); // Wypełnianie tablicy z danymi $posts = array(); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) $posts[] = $row; mysql_close($link); // Dołączenie widoku require('view.php');?> <html> <head> <title>list of Posts</title> </head> <body> <h1>list of Posts</h1> <table> <tr><th>date</th><th>title</th></tr> <?php foreach ($posts as $post):?> <tr> <td><?php echo $post['date']?></td> <td><?php echo $post['title']?></td> </tr> <?php endforeach;?> </table> </body> </html> Kontroler index.php Widok view.php
<?php function getallposts() { }?> //Łączenie, wysyłanie zapytania, wypełnianie tablicy posts $link = mysql_connect('localhost', 'myuser', 'mypassword'); mysql_select_db('blog_db', $link); $result = mysql_query('select date, title FROM post', $link); $posts = array(); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) $posts[] = $row; mysql_close($link); return $posts; Model model.php <?php // Dołączenie modelu require_once('model.php'); // Pobranie listy postów $posts = getallposts(); // Dołączenie widoku require('view.php');?> Kontroler index.php
function getallposts() { $link = open_connection('localhost', 'myuser', 'mypassword'); $result = query_database('select date, title FROM post', 'blog_db', $link); $posts = array(); while ($row = fetch_results($result)) { } $posts[] = $row; } close_connection($link); return $posts; function open_connection($host, $user, $password) return mysql_connect($host, $user, $password); Model model.php function close_connection($link) mysql_close($link); function query_database($query, $database, $link) { mysql_select_db($database, $link); return mysql_query($query, $link); } Warstwa pośrednia do mysql function fetch_results($result) return mysql_fetch_array($result, MYSQL_ASSOC);
Dalszy podział warstwy widoku
<h1>list of Posts</h1> <table> <tr><th>date</th><th>title</th></tr> <?php foreach ($posts as $post):?> <tr> </tr> <td><?php echo $post['date']?></td> <td><?php echo $post['title']?></td> <?php endforeach;?> </table> <?php $title = 'List of Posts'; $posts = getallposts(); include(layout.php);?> <html> <head> <title><?php echo $title?></title> </head> <body> <?php include('mytemplate.php');?> </body> </html> mytemplate.php view.php layout.php widoku Dalszy podział warstwy
Ćwiczenie Proszę przepisać stworzony w poprzednim ćwiczeniu skrypt, tak aby był zgodny z modelem MVC.
Model MVC w Symfony Podział kontrolera Front controller Akcje (actions) Elementy wymagane do stworzenia strony w Symfony: Model layer Database abstraction Data access View layer View Template Layout Controller layer Front controller Action
<?php class weblogactions extends sfactions { } public function executelist() { } $this->posts = PostPeer::doSelect(new Criteria()); <?php slot('title', 'List of Posts')?> <h1>list of Posts</h1> <table> <tr><th>date</th><th>title</th></tr> <?php foreach ($posts as $post):?> <tr> <td><?php echo $post->getdate()?></td> <td><?php echo $post->gettitle()?></td> </tr> <?php endforeach;?> </table> <html> <head> <title><?php include_slot('title')?></title> </head> <body> <?php echo $sf_content?> </body> </html> List Action List Template Layout Symfony Ten sam przykład w
Instalacja frameworka Pobierz środowisko (będziemy używać wersji 2.3.5): http://symfony.com/download?v=symfony_standard_vendors_2.3.5.zip Zainstaluj środowisko. Katalog z frameworkiem powinien mieć nazwę StudAd (na stronie jest jobeet). Projekt powinien być dostępny pod adresem: http://localhost:8080 Proszę włączyć odpowiednie moduły apache (np. rewrite_module) Proszę nie pobierać wersji z subversion. http://www.ens.ro/2012/03/22/symfony2-jobeet-day-1-starting-up-theproject/
Konfiguracja PHP Storm Przegraj pliki Symphony do katalogu StudAd Stwórz nowy projekt w PHP Storm, jako katalog podaj StudAd z pełną ścieżką. PHP Storm wykryje, że tam jest Symphony. Zgódź się na automatyczne wykrycie frameworka i ustawienie opcji Przejdź przez konfigurację bazy danych i Apache raz jeszcze (dla każdego nowego projektu to trzeba robić)
Konfiguracja PHP Storm Popraw automatycznie wykryte mapowania File -> Settings -> Directories Pozwól na automatyczne mapowanie Dodaj katalogi app/cache i app/logs do Excluded Kliknij Apply
Konfiguracja PHP Storm
Konfiguracja PHP Storm Popraw automatycznie wykryte mapowania File -> Settings -> PHP -> Framework Integration Dodaj katalog src jako Project code directory Dzięki temu możliwy będzie tzw. widok frameworka (View -> Tool Windows -> Framework) który okaże się bardzo wygodny i przydatny
Konfiguracja PHP Storm
Konfiguracja PHP Storm Przejdź przez konfigurację bazy danych i Apache raz jeszcze (dla każdego nowego projektu to trzeba robić) Jako dokument root użyj folderu web w katalogu projektu
Konfiguracja PHP Storm Dodaj obsługę linii komend: Settings -> Project Settings -> Command Line Tool Support -> + Choose tool: Symphony Visibility: project Path to Symphony: <projekt>\app\console Path to PHP executable: powinno być ustawione, jak nie to katalog C:\xampp\php\php.exe Wszędzie, gdzie będziemy używać konsoli, możesz ją wywołać z PHP Storm za pomocą Ctrl+Shift+X. Alias dla komend symphony to s
Konfiguracja PHP Storm
Konfiguracja PHP Storm Dodaj konfigurację Web Servera: Run -> Edit configuration -> + -> PHP Web Application Server: lokalny XAMPP
Poprawnie zainstalowane Symfony
Tworzenie projektu Stwórz nowy projekt o nazwie Ens/StudAdBundle. Skorzystaj w tym celu z konsoli i scenariusza generatebundle Na następne zajęcia: gotowe instalacje Symphony, stworzone projekty. Sprawdź poprawność wygenerowanego projektu w katalogu StudAd/src powinny znajdować się podkatalogi Ens/StudAdBundle