1 WEBEXPO, PRAHA 24. ZÁŘÍ 2011 BARTON STUDIO s.r.o. BARTON ADVERTISING Pavel Campr2 Obsah přednášky: 30 min 1 Éra nových PHP frameworků 2 Symfony2 úv...
Obsah přednášky: 1 – Éra nových PHP frameworků 2 – Symfony2 – úvod 3 – Symfony2 – výběr z toho nejlepšího
www.bartonstudio.cz
30 min
Co dnes máme… mnoho frameworků… (nejen PHP)
roste jejich využití, více zkušeností
* http://xkcd.com/927
Jak vzniklo to, co dnes máme? Ne vždy se vědělo, čeho by měl XY framework přesně dosáhnout. Až po dokončení se zjistilo, co se povedlo a co ne. Není cesta zpět. Musí se dodržet zpětná kompatibilita. Není cesta kupředu. Při zachovávání zpětné kompatibility nelze v určité chvíli pokračovat dál.
Magie = problém v reálném světě Něco se stane, nevíme proč, nebo jak… … __get() __set() __call()
Nejasné API Nedostatečná dokumentace Globální konstanty… … define('DEBUG', true);
SCOP vs OOP Static Class Oriented Programming Object Oriented Programming XY::getLogger()->error(…); $this->get(‘logger‘)->error(…);
Éra nových PHP frameworků • Nové koncepty, zahození starých špatných, ponechání starých dobrých (MVC) • Feedback od komunity vývojářů • Standardy + „do not reinvelt the wheel“ • PHP 5.3 … a několik let tu bude s námi • Namespaces, Anotace • Zrušení magie – explicitní metody a proměnné, čistý kód // na úkor funkcionality (?) • Malé „jádro“, využití existujících komponent • Dependency injection // singleton ne (?) • Nástroje – Git
http://www.sxc.hu
symfony vs Symfony2 http://www.symfony-project.org http://www.symfony.com říjen 2005 – 1. revize (SVN) leden 2010 – 1. revize (Git) prosinec 2008 – verze 1.2.0 28. červenec 2011 - verze 2.0 současná stable verze 1.4.14 současná stable verze 2.0.1 LTS (long term support) do listopadu 2012 LTS – až od Symfony 2.1 PHP 5.2 PHP 5.3 + ověřené, komunita + známé „best practices“ + plugins - provázané a závislé komponenty bez šablonovacího systému + dokumentace - končí LTS
Symfony2: „Build your App, not your Tools!“ 250 vývojářů (v den vydání 2.0), 18 měsíců vývoje github.com: 3021 watchers (#1 in PHP, #25 overall), 773 forks (#1 in PHP, #13 overall) Standardy: • HTTP specifikace // RFC2616 • PHPUnit • Namespaces • YAML, XML • PSR-0 autoloading • …
Bundle Bundle je adresář. Obsahuje vše potřebné pro implementaci jedné funkcionality. (logování, zabezpečení, profilování, blog, katalog produktů, admin generátor, …)
Tvoříme aplikaci. Konvertujeme Request do Response. GET / HTTP/1.1 Host: webexpo.cz Accept: text/html User-Agent: PowerPoint/1.0
… přidáme trochu Symfony2 getPathInfo(); // the URL being requested if (in_array($path, array('', '/')) { $params = $request->getParameters(); $response = new Response('"foo" is:'.$params['foo']); } else { $response = new Response('Page not found.', 404); } $response->send();
* symfony.com
Start nové Symfony2 aplikace 1) 2) 3) 4)
Vytvořit a zaregistrovat nový bundle. $ php app/console Nachystat URL adresy („route“), … … ty nasměrovat na nové akce, … … které vytvoří Response objekt (nejčastěji přes šablonu).
Vytvoření akce (nejjednodušší provedení) // src/BartonStudio/WebexpoBundle/Controller/HelloController.php namespace BartonStudio\HelloBundle\Controller; use Symfony\Component\HttpFoundation\Response; class HelloController { public function indexAction($name) { return new Response('Hello '.$name.'!'); } }
Vytvoření akce lépe - s využitím šablony // src/BartonStudio/WebexpoBundle/Controller/HelloController.php namespace BartonStudio\WebexpoBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class HelloController extends Controller { public function indexAction($name) { return $this->render('BartonStudioWebexpoBundle:Hello:index.html.twig', array('name' => $name)); } }
Vytvoření akce pokročile (využití anotací pro nastavení routingu, zabezpečení a zapnutí šablony) /** * @Route("/hello/admin/{name}", name="secured_hello_admin") * @Secure(roles="ROLE_ADMIN") * @Template() */ public function helloAdminAction($name) { return array('name' => $name); }
Stejný PHP kód, jiná konfigurace: logování, profilování využití cache ladicí nástroje odesílání e-mailů routing
http://www.sxc.hu
Testování, profilování PHPUnit 3.5.11 nebo vyšší request('GET', '/hello/Webexpo'); // Write some assertions about the Response $this->assertTrue( $crawler->filter('html:contains("Hello Webexpo")')->count() > 0 ); // Check that the profiler is enabled if ($profile = $client->getProfile()) { // check the number of requests $this->assertTrue($profile->getCollector('db')->getQueryCount() < 10); // check the time spent in the framework $this->assertTrue( $profile->getCollector('timer')->getTime() < 0.5); } } }
Lze vytvořit i více klientů najednou.
Web Debug Toolbar
„Service container“ Služba (service) = PHP objekt, který je vytvořen pro konání „globálních“ úloh. Je využíván všude, kde je nutné využít jeho funkcionalitu. Service container = PHP objekt, který vytváří, spravuje a poskytuje jednotlivé služby // uvnitř akce $mailer = $this->get('mailer'); $ php app/console container:debug [container] Public services Name Scope acme.demo.listener container annotation_reader container assetic.asset_manager container database_connection n/a debug.event_dispatcher n/a doctrine container esi container filesystem container form.factory container http_kernel container kernel container logger container mailer container profiler container request request router container service_container container session container templating container twig container
Class Name Acme\DemoBundle\ControllerListener Doctrine\Common\Annotations\FileCacheReader Assetic\Factory\LazyAssetManager alias for doctrine.dbal.default_connection alias for event_dispatcher Symfony\Bundle\DoctrineBundle\Registry Symfony\Component\HttpKernel\HttpCache\Esi Symfony\Component\HttpKernel\Util\Filesystem Symfony\Component\Form\FormFactory Symfony\Bundle\FrameworkBundle\HttpKernel Symfony\Bridge\Monolog\Logger Swift_Mailer Symfony\Component\HttpKernel\Profiler\Profiler Symfony\Bundle\FrameworkBundle\Routing\Router Symfony\Component\HttpFoundation\Session Symfony\Bundle\TwigBundle\TwigEngine Twig_Environment
Vytvoření vlastní služby # app/config/config.yml … vytvoření služby "napevno" services: my_mailer: class: BartonStudio\WebexpoBundle\Mailer arguments: [sendmail] # transportni vrstva
# app/config/config.yml … vytvoření služby s měnitelnými parametry parameters: my_mailer.class: BartonStudio\WebexpoBundle\Mailer my_mailer.transport: sendmail services: my_mailer: class: %my_mailer.class% arguments: [%my_mailer.transport%]
# src/BartonStudio/WebexpoBundle/Resources/config/services.yml # využití jiných služeb = Referencing (Injecting) Services parameters: newsletter_manager.class: BartonStudio\WebexpoBundle\Newsletter\NewsletterManager services: newsletter_manager: class: %newsletter_manager.class% arguments: [@my_mailer, @templating]
Twig – šablonovací systém • • • •
přednastavený, ale není povinný nejen pro (x)html, ale i pro xml, php, txt, … rychlý, rozšiřitelný, bezpečný, jednoduchý dědičnost – základní šablona nachystá „bloky“, ty se pak vloží do nadřazené šablony
prod environment , HTTP požadavky prohlížeče při načtení stránky „ahoj“: GET http://webexpo2011demo.czlocal/app.php/cs/webexpo/ahoj GET http://webexpo2011demo.czlocal/js/a2e2c51.js GET http://webexpo2011demo.czlocal/css/a498173.css
Cache Nejefektivnější možnost pro zrychlení aplikace:
uložit celý výstup (www stránku) do cache. Nejde vždy Typy cache: • Browser cache – Uvnitř www prohlížeče. Pro jednoho uživatele. • Proxy cache – poskytovatelé připojení (ISP), zvyšuje rychlost odezvy a snižuje provoz na síti. Pro více uživatelů. • Gateway cache (reverse proxy, surrogate cache, HTTP akcelerátor) – podobně jako proxy cache, ale je přímo na serveru.
http://www.sitepoint.com
Cache Symfony2 využívá pro řízení a konfiguraci cache pouze HTTP standard. HTTP/1.1 200 OK Date: Sat, 24 Sep 2011 10:18:41 GMT Server: Apache/1.3.3 (Unix) Cache-Control: max-age=3600, must-revalidate Expires: Sat, 24 Sep 2011 11:19:41 GMT Last-Modified: Fri, 23 Sep 2011 02:28:12 GMT ETag: "3e86-410-3596fbbc" Content-Length: 5040 Content-Type: text/html
Cache HTTP Expiration / nastavení v akci // gateway cache – máme teď zapnuto public function listAction() { // … $response = $this->render(‘…‘); $response->setMaxAge(60); // chceme pro všechny uživatele // uložit výsledek akce do gateway cache $response->setSharedMaxAge(60); return $response; }
standard ESI – Edge Side Includes <esi:include src="http://example.com/1.html" alt="http://bak.example.com/2.html" onerror="continue"/>
Implementováno v Symfony2 uvnitř reverse proxy. Lze využít i jiné (Varnish).
Do cache lze díky ESI ukládat fragmenty www stránky nezávisle.
ESI - ukázka {{ article.title }}
{{ article.body }}
{% endblock %} {% block sidebar %}
Twitter
// zde bude vlozen tag <ESI> , pokud je to povoleno: // <esi:include src="{{ path('twitter_list') }}" /> // lépe udělat takto: {% render 'BartonStudioTwitterBundle:Twitter:list' {'standalone': true} %} {% endblock %}
// zobrazení článku blogu (v bloku „body“) a aktuální výpis z twitteru (v bloku „sidebar“)
Znepřístupnit uživateli (1) místa, kam by neměl mít přístup (2).
Lze řídit: • přístup uživatele k akcím („editace článků“). • nebo detailněji – ACL (access control list) pro řízení přístupu k jednotlivým instancím objektů („kdo může editovat článek #81“) * symfony.com
* symfony.com
Co jsme nestihli Formuláře Validace Databáze Model, ORM (Doctrine 2) Překlady, I18n, L10n Emaily (SwiftMailer) …
Co jsme neměli rádi a teď se nám líbí Příkazová řádka Anotace
Co nám zatím chybí Chybí větší tutorial (ala Jobeet ze symfony 1.2) Nejasné „best practices“
Roadmap Symfony 2.1 (LTS - Long Time Support) • konec roku 2011 • první verze, kde všechny komponenty budou mít stabilní API (anotace @api)
Zdroje a užitečné odkazy: www.symfony.com – „The Book“, „The Cookbook“ symfony.com/components github.com/kriswallsmith/assetic twig.sensiolabs.org silex.sensiolabs.org
Na shledanou nad vaším projektem BARTON STUDIO s.r.o. www.bartonstudio.cz