Wprowadzenie do framework’a Symfony - tjach.pltjach.pl/tresc/uploads/2014/11/SW-lab1.pdf ·...

43
Wprowadzenie do framework’a Symfony

Transcript of Wprowadzenie do framework’a Symfony - tjach.pltjach.pl/tresc/uploads/2014/11/SW-lab1.pdf ·...

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

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+XAMPP+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

$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

Wzorzec MVC

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 podział warstwy widoku

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

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