rótki i szybki przegląd frameworkówtjach.pl › tresc › uploads › 2014 › 11 ›...

Post on 08-Jun-2020

0 views 0 download

Transcript of rótki i szybki przegląd frameworkówtjach.pl › tresc › uploads › 2014 › 11 ›...

Krótki i szybki przegląd frameworków

Framework Framework to szkielet do budowy aplikacji

Definiuje on strukturę aplikacji oraz mechanizm jej działania.

Dostarcza zestaw komponentów i bibliotek.

Programista tworzy aplikacje poprzez rozbudowę i dostosowanie poszczególnych komponentów do wymagań realizowanego projektu, tworząc gotową aplikację.

Po co?

Efektywność

Poprawa jakości kodu

Niezawodność

Szybkość (RAD)

Łatwiejsze testowanie

Czemu nie?

Złożoność

Wydajność

Na co zwracać uwagę?

MVC

• Czy framework wykorzystuje architekturę model-widok-kontroler?

Baza danych

• Czy framework wykorzystuje różne silniki bazodanowe?

ORM

• Czy framework obsługuję mapowanie relacyjno-obiektowe?

Szablony • Czy framework wykorzystuje szablony?

Na co zwracać uwagę? Caching

• Czy framework obsługuje mechanizmy cache’owania treści?

Walidacja • Czy framework posiada wbudowany moduł walidacyjny?

Ajax • Czy framework obsługuje AJAXa?

Auth Module

• Czy obsługa autentyfikacji jest zapewniona?

Moduły

• Czy można rozszerzyć możliwości frameworka przez dodanie RSS readera, czy modułu PDFów?

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

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.

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

Smarty – przykład użycia szablonów

Smarty to system szablonów dla PHP.

Najczęściej używany do odseparowania wersji treści (np. wersji językowych)

Oddziela treść od back-endu

Zmniejsza koszt powstawania aplikacji

Działa za pomocą szablonów i mapowania ich pod określoną zawartość.

Jako język szablonów korzysta z pętli, zmiennych, funkcji logicznych, itp.

Smarty – przykład użycia szablonów

Mechanizm cache’owania Cache przyspiesza dzaiłanie strony.

Zmniejsza obciążenie (głównie bazy danych)

Załóżmy, że blog wyświetla zawsze ostatnie 10 wpisów. To po co za każdym razem odpytywać bazę danych po te same 10 wpisów?

Także konfigurację i inne czasochłonne „obliczenia” trzymamy w cache (uwaga na bezpieczeństwo!)

W PHPie się to czasem „akcelerator” nazywa.

Mechanizm cache’owania • Openc Source, trzyma obiekty w pamięci operacyjnej

• Używane np. przez Facebooka APC

• Przestarzały wspierany do 2003 r.) ionCube

• Przestarzały (umarł w 2012 r.) eAccelerator

• Całkiem nowy i obiecujący Xcache

• Optymalizuje także kod PHP

• Dostarczony razem z PHP (od wersji 5.5) Zend Opcache

Przegląd Frameworków

http://www.phpframeworks.com/

Cake PHP

Cake PHP Open Source Wymuszone konwencje nazewnicze, wymuszona organizacja

kodu i projektu Zintegrowana obsługa CRUD, Wbudowane listy kontroli dostępu, Scaffolding, Wbudowaną kontrola i walidacja formularzy, Wsparcie dla Prototype i script.aculo.us Wsparcie mechanizmu routingu Duże wsparcie użytkowników, społeczność, tutoriale Zalety: tutoriale, przykłady, silne narzędzia do generowania

kodu, pluginy, wsparcie przez IRC Wady: wymuszanie nazewnictwa, wydajność

Zend

http://webhosting.pl/Frameworki.PHP.przeglad.pieciu.najpopularniejszych.narzedzi.dla.programistow.WWW

Zend OO , do tego Open Source Obsługuje MVC W trzy i trochę modułów (obsługa baz danych, Web

services, wsparcie RAD (Rapid Application Development)) Modularny – nie trzeba używać głównego silnika Wymagana znajomość wzorców projektowych Duża społeczność, świetna dokumentacja Aktualnie na SourceForge i Google Code znajduje się w

sumie około 400 projektów bazujących na tej platformie i do tej pory została ona pobrana ponad 10 milionów razy

Zalety: elastyczność, wsparcie społeczności, zapewniony rozwój, bardzo dobra dokumentacja

Wady: stopień komplikacji, wymaga dużo czasu do opanowania

Symfony

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

Laravel

Laravel RESTful Routing

Korzysta z ORMa (Eloquent)

Korzysta z szablonów (Elade)

Łatwe skalowanie (JSON API, RESTful, itp.)

Oparty na niektórych elementach Symfony

Composer

Duże wsparcie społeczności

Wsparcie dla refactoringu

Yii

Yii Szybkie

Modułowa budowa pozwala na dołączanie tylko potrzebnych rzeczy. Do tego cache działa. Podobno AJAX też jest szybki.

Bezpieczny

Wbudowane walidatory wejśca, wyjścia, SQLa. Wbudowane zabezpieczenia przed SQL injection i XSS.

Profesjonalny

CodeIgniter

CodeIgniter Malutki. Zajmuje tylko 500kB.

Przejrzysta dokumentacja

Kompatybilny z większością hostingów (wymaga PHP>= 5.1.6)

Brak restrykcji co do konwencji nazw

Łatwy w użyciu – korzysta z MVC, ale go nie narzuca

Wysoka wydajność

Brak wielgachnych bibliotek

Bezbolesna konfiguracja

Można, ale nie trzeba korzystać z szabalonów

Phalcon

Napisany w C :)

Phalcon ODM for Mongo

Template Engine (Volt)

DI/IOC

Events Management

Encryption

HTTP Request / Response / Cookies

Escaping / Filtering

Forms Builder / Validation

Flash Messages

Cache

Pagination

Annotations

Security

Translations

Assets Management

Universal Auto-Loader

Logging

CLI

Wydajność

Wydajność

Wydajność

Kiedy stosować framework? 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 –wykorzystaj „lekki” framework

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 – zdecydowanie framework

Jeśli tworzysz statyczną wizytówkę, z 2-3 podstronami, bez wodotrysków i zarządzania – użyj raczej czystego PHP (albo nawet tylko HTML + JS)