Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Podobné dokumenty
Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Snadný vývoj webových aplikací s Nette. Lukáš Jelínek

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Ruby on Rails. Bc. Tomáš Juřík Bc. Bára Huňková

Postup. Úvodem. Hlavní myšlenka frameworku. application. system. assets. uploads

Použití databází na Webu

Ing. Přemysl Brada, MSc., Ph.D. Ing. Martin Dostal. Katedra informatiky a výpočetní techniky, FAV, ZČU v Plzni

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové technologie

Návrh a tvorba WWW stránek 1/14. PHP a databáze

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

Stručný úvod pro programátory. Michal Kuchta

1 Webový server, instalace PHP a MySQL 13

Aplikační vrstva. Úvod do Php. Ing. Martin Dostal

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové technologie

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Střední průmyslová škola elektrotechnická Praha 10, V Úžlabině 320 M A T U R I T N Í T É M A T A P Ř E D M Ě T U

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

InterSystems Caché Post-Relational Database

Technologie Java Enterprise Edition. Přemek Brada, KIV ZČU

Design Patterns. Tomáš Herceg Microsoft MVP (ASP.NET)

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové technologie

KIV/PIA 2013 Jan Tichava

Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MySQL základní pojmy, motivace Ing. Kotásek Jaroslav

Střední průmyslová škola elektrotechnická Praha 10, V Úžlabině 320

Databázové a informační systémy

Instalace a konfigurace web serveru. WA1 Martin Klíma

1. Webový server, instalace PHP a MySQL 13

Hiearchical MVC (Model-view-controller) vs. PAC (Presentation-abstraction-control)

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Plánování a vývoj základního frameworku

typová konverze typová inference

Vstupní požadavky, doporučení a metodické pokyny

GTL GENERATOR NÁSTROJ PRO GENEROVÁNÍ OBJEKTŮ OBJEKTY PRO INFORMATICA POWERCENTER. váš partner na cestě od dat k informacím

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Skriptovací jazyky. Obsah

Nástroje a frameworky pro automatizovaný vývoj. Jaroslav Žáček jaroslav.zacek@osu.cz

KAPITOLA 3. Architektura aplikací na frameworku Rails. V této kapitole: modely, pohledy, řadiče.

INOVACE PŘEDMĚTŮ ICT. MODUL 11: PROGRAMOVÁNÍ WEBOVÝCH APLIKLACÍ Metodika


Maturitní témata z předmětu PROGRAMOVÉ VYBAVENÍ pro šk. rok 2012/2013

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

Databáze II. 1. přednáška. Helena Palovská

Jaku b Su ch ý 1

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

VÝVOJ INTERNETOVÝCH APLIKACÍ - VIA

Architektura softwarových systémů

Tvorba WWW stránek. přehled technologií používaných na webu principy jednotlivých technologií a možnosti jejich vzájemného kombinování

PHP Best Practices. Please try to fit your code to 80 columns. That's decimal 80. A. Morton

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Vhodnost nasazení jednotlivých webových architektur, sdílení dat, perzistence, webové služby a REST, asynchronnost, messaging

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

návrhový vzor Singleton.

Server-side technologie pro webové aplikace

UJO Framework. revoluční architektura beans. verze

Knot DNS Resolver. Modulární rekurzivní resolver. Karel Slaný

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Nové jazykové brány do Caché. Daniel Kutáč

AJAX. Dynamické změny obsahu stránek

Semestrální práce z DAS2 a WWW

Komponentově orientované webové frameworky. Jiří Stránský twitter.com/jistr

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

2012 ET NETERA a.s. Wicket přehled technologie Martin Strejc

Úvodem 9. Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10. Než začneme 11

language="javascript">... </script>.

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

Klíčová slova: dynamické internetové stránky, HTML, CSS, PHP, SQL, MySQL,

Maturitní témata Školní rok: 2015/2016

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

Reranking založený na metadatech

rychlý vývoj webových aplikací nezávislých na platformě Jiří Kosek

PHP PHP je skriptovací programovací jazyk dynamických internetových stránek PHP je nezávislý na platformě

GWT pro pokročilé. MoroSystems, s.r.o. Pavel Klobása. Senior Java Developer.

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

Databázové systémy. Cvičení 6: SQL

IS pro podporu BOZP na FIT ČVUT

D R U P A L V O J T Ě C H K U S W O J T H A

Java a XML. 10/26/09 1/7 Java a XML

Ukázka knihy z internetového knihkupectví

4. lekce Přístup k databázi z vyššího programovacího jazyka

Systém pro analýzu dat operátorů a obráběcích strojů ve strojírenské výrobě. Bc. Roman Sucháček

Nasazení Object Relation Mapping nástrojů nad legacy datovým modelem

Jazyk C# (seminář 6)

Od CGI k FastCGI. Uvedené dílo podléhá licenci Creative Commons Uved te autora 3.0 Česko.

Rezervační systém Tvorba WWW stránek

O Apache Derby detailněji. Hynek Mlnařík

VZOROVÝ STIPENDIJNÍ TEST Z INFORMAČNÍCH TECHNOLOGIÍ

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

Model-View-Controller architektura PHP frameworks

Servlety a JSP. Petr Adámek, petr.adamek@ibacz.eu

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Programovací jazyky Přehled a vývoj

Drupal. Svobodný redakční systém. duben 2007 Jakub Suchý 1

Transkript:

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: 23.2.2016 Webové aplikace PHP OOP, PHP a databáze, migrace DB, ORM, šablony, MVC/MVP, PHP frameworky

strana 2 PHP skriptovací jazyk dynamicky typovaný interpret skriptů spouští se jako modul v Apache HTTP server při instalaci se registruje koncovka php k interpretu v httpd.conf

PHP strana 3

strana 4 PHP výhody funkce pro zpracování textu -> WWW multiplatformní podpora, rozšířenost, komunita hotové aplikace (mnoho volných) dokumentace na php.net a jinde

strana 5 PHP nevýhody nekonzistentí API knihovny funkcí str_* X str* skript běží jen po dobu obsluhy požadavku nutnost ukládat stav do DB, vždy znovu spustit aplikaci není možné realizovat daemona nemá standardní ladící nástroje

strana 6 PHP Vložení PHP kódu: značka?> je nepovinná <?php?> echo "Hello world!"; text za?> může způsobit problémy s fcí header()

strana 7 PHP předávání parametrů typ function fce( $povinny, $nepovinny = false, Trida $typovany, Array $pole, Trida $typovanynepovinny = null, Array $polenepovinne = array() ) { } nepovinné parametry s výchozí hodnotou

strana 8 PHP objekty Viditelnost metod a vlastností public, private, protected Přetěžování metod Dědičnost jediný předchůdce Interfaces Traits

strana 9 PHP objekty - magické metody construct() destruct() get($n) set($n, $v) call($n) tostring()... $this->cokoliv = ; zavolá set("cokoliv") $objekt = new ; echo $objekt;

strana 10 PHP objekty - interface interface Soundable { } function makesound(); funkce, které musí třída implementovat interface Eatable() { }

strana 11 PHP objekty - abstraktní třída abstract class Animal { private $name; function construct($n) { $this->name = $n; } } abstraktní fce nemá tělo (podobně jako interface) abstract function caneat(eatable $a); function tostring() { return $this->name; }

strana 12 PHP objekty - dědičnost class Cat extends Animal implements Soundable { } private $sound = "Meow"; function makesound() { } echo $this->sound; function caneat(eatable $a) { } return $a instanceof Mouse;

strana 13 PHP objekty - dědičnost class Mouse extends Animal implements Soundable, Eatable { } private $sound = "Squeak"; function makesound() { } echo $this->sound; function caneat(eatable $a) { } return $a instanceof Cheese;

strana 14 PHP objekty - dědičnost pozor na přetěžování metod nelze mít více metod stejného názvu s různými parametry nelze odebrat parametr lze mu nastavit výchozí hodnotu

strana 15 PHP objekty - statické metody class AnimalFactory { const CAT = 0; const MOUSE = 1; public static function makeanimal($p, $n) { if($p == self::cat) { return new Cat($n); } else { return new Mouse($n); } } }

strana 16 PHP objekty - statické metody $cat = AnimalFactory::makeAnimal( AnimalFactory::CAT, "Tom" ); $mouse = AnimalFactory::makeAnimal( AnimalFactory::MOUSE, "Jerry" ); if($cat->caneat($mouse)) { echo $cat. " muze jist ". $mouse; echo "<br />". $cat->makesound(); }

strana 17 PHP objekty - traits trait Trait1 { } function f1() { } trait Trait2 { } function f2() { } class Trida { } use Trait1, Trait2; třída má nyní funkce f1 a f2

strana 18 PHP jmenné prostory Mohou obsahovat třídy interface trait funkce konstanty

strana 19 PHP jmenné prostory namespace Moje; $a = new \Cizi\Trida(); use \Cizi\Trida; use \Cizi\Trida2 as Tr2; $b = new Trida(); $c = new Tr2();

strana 20 PHP anonymní funkce $func = function($var) { return strtoupper(trim($var)); }; $func("ahoj"); //nebo jako parametr jinafunkce($func); jinafunkce(function($p) { });

strana 21 PHP předání metody třídy $objekt = new Trida(); $objekt->metoda(); zavolej(array($objekt, "metoda"));

strana 22 Volání funkce předané názvem/polem //argumenty jsou vyjmenovany $ret = call_user_func("nazevfce", $param1, ); $instance = new Trida(); $ret = call_user_func( array($instance, "nazevfce"), $param1, ); $ret = call_user_func( array("trida", "nazevfce"), $param1, ); //argumenty predany jako pole $ret = call_user_func_array(, array($param1, ));

strana 23 PHP7 typ. kontrola pro skalární typy (volitelně) operátor?? echo $_GET[" "]?? "vychozi hodnota" operátor <=> pro řazení (vrací 0, -1, 1) $v = 1 <=> 2; -1 anonymní třídy zrušeno rozhraní MySQL rychlost!

Návrhové vzory strana 24

strana 25 Otázka k zamyšlení: Dokázali byste napsat server-klient aplikaci s GUI a databází v relativně krátkém čase v jiném než webovém prostředí? asi ne v PHP to umí kde kdo (i děti na ZŠ) mohou to dělat dobře? jak to dělat správně? jak se neztratit v kódu? jakou?

strana 26 Tvorba software a návrh Dobrý návrh aplikací je důležitý pro větší projekty udržovatelnost testovatelnost dodržet termín dodání vlastní psaní kódu je dílčí část procesu v PHP se píšou aplikace malé i velké je snadné začít může být těžké růst aby kód mohl upravovat i někdo jiný, aby mohlo spolupracovat víc vývojářů volte správné nástroje pro vaše cíle

strana 27 Návrhový vzor znovupoužitelné řešení nějakého problému Programování Elektrotechnika Strojírenství Základní jednotka Řádek kódu Součástka (kondenzátor, odpor, dioda, ) Celek Funkce, třída Elektrický obvod (zapojené součástky) Funkční celek Vrstva aplikace, knihovna Osazený plošný spoj (zesilovač, zdroj, trafo, ) Produkt Software Zařízení Stroj Díl (hřídel, ozubené kolo, šroubek, ) Sestava (převod, sešroubované díly, ložisko, ) Spojka, motor, převodovka, diferenciál

strana 28

strana 29 Známé návrhové vzory Singleton MVC/MVP Factory ORM Active Record, Data Access Object Pozor na anti-pattern špagetový kód, copy-paste programování

PHP a databáze strana 30

strana 31 Databáze Relační MySQL, PostgreSQL, SQLite, monžné nádstavby např. pro GIS Jiné - pro speciální použití Objektové databáze Sloupcové databáze XML databáze

strana 32 Databáze většinou stačí CRUD operace SQL jazyk SELECT * FROM table JOIN WHERE GROUP BY ORDER BY LIMIT UPDATE table SET k = v WHERE DELETE FROM table WHERE INSERT INTO table (k1, k2, ) VALUES (v1, v2, )

strana 33 PHP a databáze možnost práce přes rozšíření mysqli, mysql sqlite PDO univerzální pro různé DB Existují knihovny realizující ORM obvykle součástí frameworku zavrženo v PHP 5.5.0 odstraněno v PHP 7.0.0 abstrakce DB - nezávisí na konkrétní implementaci

strana 34 PHP aplikace a databáze DB struktura je součástí aplikace chybějící sloupec způsobí kolaps aplikace problém jsou změny struktury při změnách aplikace kdo mi řekne, že kolega udělal změnu? jak udržet strukturu na všech strojích, kde aplikace běží stejnou? můžu si zapisovat ručně změny?

strana 35 Migrace DB systém pro procedurální tvorbu DB struktury výhodné pro týmy každá změna DB je realizována jako skript podpora rollback (undo) např. systém Phinx nebo součástí frameworku Laravel

strana 36 Migrace DB function up() { Schema::create('traffic_info', function($table) { $table->increments('id'); $table->string('msg_id', 100); $table->timestamp('created_at'); $table->datetime('generated'); $table->string('text', 500)->nullable(); $table->double('lat')->nullable(); $table->double('lon')->nullable(); }); } function down() { Schema::drop('traffic_info'); } undo!

strana 37 ORM Object Relational Mapping mapuje databázi na objekty využívá cizí klíče nebo konfigurační soubory pro relace Vzory (design pattern): Active record Data mapper Generátory kódu

strana 38 ORM výhody a nevýhody výhody není nutné psát jednoduché SQL je nutné upravit strukturu DB některé ORM např. nepodporují kompozitní klíče nevýhody složitější dotazy a spojení tabulek se někdy realizují složitě

strana 39 ORM Active record objekty si řeší práci s DB samy $obj->save(), $obj->delete(); Data mapper práce s DB přes další objekt tzv. "mapper" $mapr->save($obj), $mapr->delete($obj)

strana 40 Active record vs Data mapper co dělat se smazanou instancí? Active record objekt obsahuje DB metody jako insert delete update Data mapper entita neobsahuje DB metody mapper může pracovat nad různými úložišti Mapper může vrátit instanci podle dat

strana 41 ORM ukázka - Active Record $user = new User(); $user->load(5); $user->email = " "; $user->save(); $user->savetofile( ); třída User je asi mix SQL kódu a logiky modelu a asi spousta dalšího

strana 42 ORM ukázka - Data mapper co to je a odkud? $daodb = daosql::users(); $user = $daodb->get(5); $user->name = " "; $user->email = " "; $daodb->store($user); entita User je nezávislá na úložišti $daofile = daofile::user(); $daofile->store($user);

strana 43 Active record vs Data mapper složitější, ale univerzálnější

MVC/MVP, Frameworky strana 44

strana 45 Počátky PHP do r. 2005 malé aplikace napsány jako mix PHP a HTML kódu větší aplikace procedurálně + šablona podpora objektů reálně funkční až od PHP5

strana 46 Šablonovací systémy např. Smarty, Twig, Latte a různá jiná řešení (i vlastní) Šablony se kompilují do PHP obvykle se parsují pomocí regulárních výrazů caching

strana 47 Šablonovací systémy - výhody Oddělení PHP a HTML oddělení prezentační logiky od aplikační přehlednost dělitelnost práce rychlost, odbornost, náklady Bezpečnost XSS htmlspecialchars()

strana 48 Šablonovací systémy - nevýhody ne vždy podpora syntaxe v IDE NetBeans + Latte je OK člověk si musí pamatovat názvy proměnných je důležitá komunikace programátor <-> kodér je nutné napsat dokumentaci

strana 49 Šablonovací systémy princip zkompilovaná šablona uložená v mezipaměti PHP kód cache šabloně se předají proměnné a načte se jako PHP kód přes include

strana 50 Šablonovací systémy ukázka //$data je asoc. pole function runtemplate($tmpl, } extract($data); include("dir/". $tmpl); array $data) {

strana 51 Šablonovací systémy ukázka {if($form->haserror())} <p>chyba...</p> {endif}

strana 52 Šablonovací systémy kompilace $script = preg_replace( ' {if\((.+?)\)} i', '<?php if(\\1) {?>', $script); nahradí {if( )} za <?php if( ) {?> $script = preg_replace( ' {end[a-z]*} i', '<?php }?>', $script); nahradí {endif} za <?php }?>

strana 53 Šablonovací systémy ukázka <?php if($form->haserror()) {?> <p>chyba...</p> <?php }?>

strana 54 Šablonovací systémy ukázka {if($form->haserror())} <p>chyba...</p> {endif} <?php if($form->haserror()) {?> <p>chyba...</p> <?php }?>

strana 55 Šablonovací systémy ukázka <table> {foreach($var as $k => $v)} <tr><td> </td></tr> {endforeach} </table>

strana 56 Šablonovací systémy ukázka <table> <?php foreach($var as $k => $v) {?> <tr><td> </td></tr> <?php }?> </table>

strana 57 MVC a MVP M = model kód měnící data v DB V = view prezentační vrstva C = controller P = presenter

strana 58 MVC vs MVP MVC controller sleduje akce uživatele a předá informace o změně do view více pro desktop nebo RIA MVP presenter předává data do view a to na základě dat zobrazí celé rozhraní

MVC vs MVP strana 59

strana 60 MVC vs MVP MVC controller může být sdílen mezi více view controller může řídit, které view se zobrazí MVP obsluhuje více view komunikace mezi view a presenterem je realizována přes interface vazba je slabší jedno view má jeden presenter (nebo více)

strana 61 Realita webových aplikací nebo presenter?

strana 62 MVC nebo MVP? hlavně oddělit business logiku (M), zobrazovací logiku (V) a aplikační logiku (C/P) závisí více na technických prostředcích každý framework pojímá problematiku trochu jinak MVW - Model View Whatever

strana 63 Framework společný název pro mnoho nástrojů Framework Šablony (Latte, Twig, Smarty, Blade, ) Formuláře ORM systém (Doctrine, Eloquent, Propel, RedBean, ) Lokalizace MVC/MVP CLI DB migrace DB seedy Maily Autentizace Autorizace

strana 64 PHP Frameworky ucelené systémy určující způsob práce knihovny architektura aplikace

strana 65 PHP frameworky - Google trends 2015

strana 66 PHP frameworky - Google trends 2016

strana 67 Který si vybrat moderní, bezpečný a vyvíjený věnujte pozornost délce podpory vybrané verze vhodný pro můj cíl s dobrou dokumentací používající nástroje, které znám Composer, Git, PhpUnit, s velkou (aktivní) komunitou

strana 68 Framework VS knihovna Inversion of control Framework řídí vás, knihovnu řídíte vy Framework = ucelená sada myšlenek a postupů složená z knihoven a sladěná tak, aby co nejlépe plnila svůj účel

strana 69 Funkce (výhody) frameworku Definuje architekturu aplikace např. MVP, push based, pull based Zlepšuje testovatelnost aplikace Poskytuje: práce s URL (routing) šablonovací systém API pro databázi (např. ORM) validace formulářů

strana 70 Funkce (výhody) frameworku API pro HTTP data a formuláře, REST GET a POST, COOKIE, SESSION, soubory migrace DB seedy DB některé mají CLI generování modelů a DB migrací seedování databáze spouštění testů práce v týmu command line interface

strana 71 Nevýhody frameworku Ne každému musí vyhovovat to, co autorovi frameworku je možné použít jiný framework což ale nejde, pokud máte projekt z poloviny hotov (lock-in) nebo taky žádný MVC lze realizovat různě (není to složité) nesnažte se vyvíjet celou aplikaci od nuly lze si vybrat knihovny a používat je

strana 72 Zpracování požadavku frameworkem obvykle se vše posílá přes index.php mod_rewrite nastaven v.htaccess framework podle cesty v URL osloví správný presenter spustí akce modelu (CRUD) předá data z modelu do šablony šablona vygeneruje HTML HTML se pošle přes HTTP routování

strana 73.htaccess RewriteEngine on RewriteCond %{REQUEST_FILENAME}!-f RewriteCond %{REQUEST_FILENAME}!-d RewriteRule (.*) index.php?q=$1 [L,QSA] cokoliv co není cesta k existující složce nebo souboru přesměrovat na index.php

strana 74 Pretty URL a mod_rewrite - frameworky někdy je nutné URL generovat z DB unikátní klíč nad sloupcem varchar(n) router předá pojmenovaný fragment do presenteru route: produkt/{$producturl} http://www.server.cz/produkt/sklenice-na-pivo => http://www.server.cz/index.php?q=produkt/sklenice-na-pivo

MVC v PHP strana 75

strana 76 Framework Nette Český MVP framework David Grudl a Nette foundation bezpečný, moderní Hlavní rysy: Latte šablony Tracy (dríve Laděnka) Nette database (dříve DiBi) Adminer (pro správu DB/administraci) Konfigurace ve formátu Neon

strana 77 Nette - konfigurace formát Neon je strukturovaný text dovoluje nastavit hodnoty pro různá prostředí vývojové ostré https://doc.nette.org/cs/2.3/configuring

strana 78 Nette - šablony Latte makra n:makra http://doc.nette.org/cs/2.1/default-macros dědičnost (layout) místo generování URL píšete volání funkcí (na presenter) známe z APV

strana 79 Nette - Tracy (Laděnka) pomocník pro ladění aplikace vyjímky a výpisy chbových hlášení měření času SQL dotazy http://doc.nette.org/cs/2.3/debugging

strana 80 Nette - databáze Nette\Database\Connection v podstatě obálka PDO dříve DiBi není ORM ORM Nette\Database\Table http://doc.nette.org/cs/2.3/database založená na notorm http://www.notorm.com/ ORM, které dynamicky čte strukturu DB

strana 81 Nette - databáze Je možné použít např. ORM Doctrine DQL jazyk objektový dialekt SQL podobná, ale jiná syntaxe a hlavně logika podobný Hibernate (Java) $query = $em->createquery('select u FROM MyProject\Model\User u WHERE u.age > 20'); $users = $query->getresult();

strana 82 PHP FIG Framework Interop Group skupina vývojářů frameworků PSR doporučení http://www.php-fig.org tzn. že to není závazné

strana 83 Porovnání frameworků https://en.wikipedia.org/wiki/comparis on_of_web_frameworks#php_2 všimněte si porovnávaných kritérií