Wprowadzenie do framework’a Symfony - tjach.pltjach.pl/tresc/uploads/2014/11/SW-lab1.pdf ·...
Transcript of Wprowadzenie do framework’a Symfony - tjach.pltjach.pl/tresc/uploads/2014/11/SW-lab1.pdf ·...
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-with-symfony2/
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
Ć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+XAMPP+with+PhpStorm+IDE
Ć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
$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'
)
);
house: family:
name: Doe parents:
- John - Jane
children: - Paul - Mark - Simone
address: number: 34 street: Main Street city: Nowheretown zipcode: "12345"
YAML – uniwersalny język formalny przeznaczony do reprezentowania różnych danych w ustrukturalizowany sposób. Przykład: PHP YAML
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
Przykład
: płaskie P
HP
na
MV
C
<?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); ?>
<?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;
}
?>
<?php // Dołączenie modelu require_once('model.php'); // Pobranie listy postów $posts = getAllPosts(); // Dołączenie widoku require('view.php'); ?>
Model model.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); function close_connection($link) mysql_close($link); function query_database($query, $database, $link) {
mysql_select_db($database, $link); return mysql_query($query, $link);
} function fetch_results($result) return mysql_fetch_array($result, MYSQL_ASSOC);
Warstwa pośrednia do mysql
Model model.php
Dalszy p
od
ział warstw
y w
ido
ku
<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>
<?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
Ć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
Ten sam
przykład
w
Symfo
ny
<?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>
Layout
List Template
List Action
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-the-project/
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 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 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 Dodaj konfigurację Web Servera:
Run -> Edit configuration -> „+” -> PHP Web Application
Server: lokalny XAMPP
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