SlideShare une entreprise Scribd logo
1  sur  115
Télécharger pour lire hors ligne
4. sraz přátel Symfony - Novoroční posezení
Moje první aplikace v Symfony 3
Praha, 28. 1. 2016, Etnetera a.s.
● muž
● 24 let
● workoholik
● 9+ let se zajímám o vývoj
webových aplikací
● 5+ let makám v oboru
● nejsem grafik!!!
Kdo jsem?
Martin Zeman @zemistr
Dřívější a aktuální pozice
● Babka: Programátor webových aplikací - puzzle
červenec 2011 - červen 2012 (1 rok)
● OSVČ: Web developer
červenec 2012 - x
● Cresco Group: Web developer
červenec 2012 - srpen 2012 (2 měsíce)
● Cresco Group: Web developer
červen 2014 - listopad 2014 (6 měsíců)
● OSVČ: Web developer
Tohle je nedůležité … Prostě už mám něco za sebou. :)
Zajímavé
Znáš Symfony?
Jo, Symfony znám!
Používám ho skoro měsíc!
Kde Symfony 3 seženu?
Začal bych u zdroje.
Ale já jsem vývojář!
Neexistuje nějaká línější metoda?
Jo, existuje.
Symfony installer
x
Composer
Composer zní sexy!
composer create-project
symfony/framework-standard-edition
my_project_name
Co to udělá?
composer create-project
symfony/framework-standard-edition
my_project_name
Hej composer vytvoř projekt
do této složky
z tohoto balíčku
Some parameters are missing.
Please provide them.
database_host (127.0.0.1):
database_port (null):
database_name (symfony):
database_user (root):
database_password (null):
mailer_transport (smtp):
mailer_host (127.0.0.1):
mailer_user (null):
mailer_password (null):
secret (ThisTokenIsNotSoSecretChangeIt):
Při instalaci to bude chtít pár údajů.
No a hotovo …
Vaše první aplikace je na světě. :-)
^.^/
Juchůů
Díky za pozornost!
Otázky?Ale teď vážně. Co budeme tvořit?
Jednoduchý “e-shop”
(hodně jednoduchý …)
Jednoduchý “e-shop”
(opravdu hodně jednoduchý …)
Máme málo času.
● Vejce - 4 ks
● Cukr - 200 g
● Polohrubá mouka - 200 g
● Jablka
● strouhané - 200 g
● Vanilkový cukr - 1 balení
● Prášek do pečiva - 1 balení
Co budeme potřebovat?
http://www.recepty.cz/recept/jablkova-babovka-3871
Dělám si prdel ;)
1. Katalog produktů
2. Košík / Dokončení objednávky
3. Zabezpečení
4. Přehled objednávek
Co budeme potřebovat?
1. Katalog produktů = “/”
2. Košík / Dokončení objednávky
○ "/cart"
○ "/cart/{sku}/{size}/remove"
3. Zabezpečení
○ "/login"
○ "/login-check"
○ "/logout"
4. Přehled objednávek
○ "/admin/{status}"
○ "/admin/{status}/change/{id}/to/{new_status}"
Routy
● 2 produkty (trička M/F)
○ název
○ obrázek
○ cena
○ velikosti
○ množství
○ a šup do košíku
● košík v sessions
Katalog produktů
● náhled košíku
○ název
○ velikost
○ počet kusů
○ cena
○ cena celkem
○ info o přidání do
košíku
But women are always right!
Formulář “male”Formulář “female”
Ano, ale tady budou nalevo.
Obyčejný výpis
Odkaz na routu
do košíku
Flash message
● výpis produktů
○ název
○ velikost
○ množství
○ cena
○ smazání z košíku
Košík / Dokončení objednávky
● dokončení objednávky
○ jméno
○ email
○ nějaká ta poznámka
○ možnost objednat :)
● po dokončení
○ zapsat do db
○ odeslat maily
Odkaz na routu
pro vymazání
položky z košíku
Odkaz na routu
do katalogu
Formulář
Text ...
Obyčejný výpis
● bezpečnost
○ přihlášení
○ odhlášení
Přehled objednávek
● objednávky
○ kontakt
○ poznámka
○ cena
○ produkty
○ stav + změna stavu
● filtr
○ dle stavu
Ručně sestavený login form
Flash message
Admin je jen pro vyvolené!
Takže může vypadat hnusně. :D
No fuuuuuuuuj!!!
Proklik na logout
Odkazy na tento výpis s
parametrem v adrese
Výpis z DB
Můžete změnit stav!!! :O
Wait …
Ještě maily!!!
Pro smrtelníky
Pro nemrtvé
Nevypadá to zle.
Co? :)
parameters:
locale: cs
framework:
translator: { fallbacks: ["%locale%"] }
twig:
form-theme: "bootstrap_3_horizontal_layout.html.twig"
parameters:
admin_password: abcd1234
Extrémní zabezpečení!
security:
providers:
in_memory:
memory:
users:
admin:
password: "%admin_password%"
roles: "ROLE_ADMIN"
encoders:
SymfonyComponentSecurityCoreUserUser: plaintext
Uživatelé jsou brány z configu a jsou jen jako čistý text.
security:
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
Pamatují si všichni routy?
1. Katalog produktů = “/”
2. Košík / Dokončení objednávky
○ "/cart"
○ "/cart/{sku}/{size}/remove"
3. Zabezpečení
○ "/login"
○ "/login-check"
○ "/logout"
4. Přehled objednávek
○ "/admin/{status}"
○ "/admin/{status}/change/{id}/to/{new_status}"
Routy
security:
firewalls:
main:
anonymous: ~
form_login:
login_path: /login
check_path: /login-check
logout:
path: /logout
target: /login
A teď něco, co souvisí s e-shopem.
Nadefinujeme si velikosti triček.
Už by to chtělo nějaký formulář ...
Ok, ale neopičte se! Udělejte si továrničku. ;)
AppBundleFactoryFormFactory
AppBundleFactoryFormFactory
__construct(
FormFactoryInterface $form_factory,
RequestStack $request_stack
)
createAndHandle($name, $type, IEntity $entity)
AppBundleEntityIEntity
Továrničku máme hotovou.
Dáme si jí do services,
ať se nám s ní hezky pracuje. :)
services:
app.factory.form_factory:
class: AppBundleFactoryFormFactory
autowire: true
Jdeme tvořit formulář!!!
^.^/
AppBundleFormProductFormType
AppBundleFormProductFormType
__construct(array $sizes)
AppBundleFormProductFormType
$builder->add('size', ChoiceType::class, ...);
$builder->add('quantity', NumberType::class, ...);
$builder->add('submit', SubmitType::class, ...);
A šup do DI
services:
app.form.product_form_type:
class: AppBundleFormProductFormType
arguments: [ "%sizes%" ]
tags:
- { name: form.type }
Formulář je hotov. Protože do něj dáváme hodnoty z DI, je potřeba do DI přidat i formulář.
Na formulář je navázána
CartItemEntity
Takže si jí teď vytvoříme. :)
AppBundleEntityCartItemEntity
AppBundleEntityCartItemEntity
Důležité proměnné, které se nemají měnit,
předáme v constructoru a dovolíme k nim
přístup jen přes gettery.
A další formulář!!!
^.^/
AppBundleFormOrderFormType
AppBundleFormOrderFormType
$builder->add('name', TextType::class, ...);
$builder->add('email', EmailType::class, ...);
$builder->add('note', TextareaType::class, ...);
$builder->add('submit', SubmitType::class, ...);
I na tento formulář je navázána entita.
Tentokrát OrderEntity
Takže si jí taky vytvoříme.
AppBundleEntityOrderEntity
AppBundleEntityOrderEntity
/**
* @DoctrineORMMappingEntity
* @DoctrineORMMappingTable(name="s_order")
*/
Info pro Doctrine, že se jedná o její entitu, která
má být v tabulce "s_order".
AppBundleEntityOrderEntity
/**
* @DoctrineORMMappingId
* @DoctrineORMMappingColumn(type="integer")
* @DoctrineORMMappingGeneratedValue(strategy="AUTO")
*/
Info pro Doctrine, že proměnná $id bude použita jako sloupeček
s číselnou hodnotou a že se do ní bude generovat unikátní ID.
Strategie generování unikátního ID se rozhodne dle typu DB.
AppBundleEntityOrderEntity
/** @DoctrineORMMappingColumn(type="string") */
/** @DoctrineORMMappingColumn(type="text", nullable=true) */
Ostatní hodnoty mají jen definovaný typ hodnoty.
AppBundleEntityOrderEntity
/** @DoctrineORMMappingColumn(type="object") */
Je tu ale jedna extra, do které se bude ukládat složitější struktura.
Konkrétně obsah košíku tak, jak se používá i na webu.
AppBundleEntityOrderEntity
/**
* @DoctrineORMMappingColumn(type="string")
* @SymfonyComponentValidatorConstraintsEmail()
*/
No a pak je tu ještě jedna věc a to je validační pravidlo pro email. :)
Protože se držíme pravidla “code first”,
tak si teď necháme dle entity
vygenerovat tabulku “s_order”.
Slouží k tomu moc fajn příkaz. :)
php bin/console
doctrine:schema:create
Už je ale na čase, začít
pracovat s nějakými daty.
Pracovat s daty v controlleru je
Prasárna
Proto si na to vytvoříme
nějakou fajn service.
Co by měla umět?
● pracovat s košíkem
● pracovat s objednávkou
Začneme tvořit controllery.
Třeba katalogem. :)
AppBundleControllerCatalogController
Ještě nespíte?
Tak budeme pokračovat košíkem. ;)
AppBundleControllerCartController
Poslední a závěrečný controller!
Admin!
AppBundleControllerAdminController
Slouží pro předání
chyby do šablony
Mrtvá metoda, slouží jen
jako placeholder.
Mrtvá metoda, slouží jen
jako placeholder.
AppBundleControllerAdminController
Jen zavolá metodu na service
a výsledek předá šabloně. Jen zavolá
metodu na
service
a udělá
redirect.
security:
firewalls:
main:
anonymous: ~
form_login:
login_path: /login
check_path: /login-check
logout:
path: /logout
target: /login
Co si z toho odnést?
Méně je více! Nepište zbytečnosti.
Anotace jsou, byly, a budou. Používejte je!
3.
Frameworky pomáhají! Používejte je.
● Controllery: 3
● Entity: 2 + 1 interface
● Factory: 1
● Form: 2
● View: 4 + 2 mail + 1 layout
● Service: 1
Výsledek
Mimochodem …
Kdo z vás dával pozor a všiml si
několika spojitostí s dějem tady v
místnosti a s tím, co jsem vám ukazoval?
Toto bylo zde v ukázkách.
Toto již nyní najdete na webu http://www.symfony.cz
https://thewackywordsmith.wordpress.com/
Otázky?

Contenu connexe

Similaire à Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)

Javascript na steroidech
Javascript na steroidechJavascript na steroidech
Javascript na steroidech
seznamVyvojari
 
Usnadněte si soužití s Doctrine
Usnadněte si soužití s DoctrineUsnadněte si soužití s Doctrine
Usnadněte si soužití s Doctrine
Filip Procházka
 

Similaire à Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze) (17)

Janek Žežula, Lukáš Balek, Michal Řehák | Targito | Novinky ze světa platform...
Janek Žežula, Lukáš Balek, Michal Řehák | Targito | Novinky ze světa platform...Janek Žežula, Lukáš Balek, Michal Řehák | Targito | Novinky ze světa platform...
Janek Žežula, Lukáš Balek, Michal Řehák | Targito | Novinky ze světa platform...
 
Javascript na steroidech
Javascript na steroidechJavascript na steroidech
Javascript na steroidech
 
Analýza klíčových slov - Plzeňský Barcamp 2015
Analýza klíčových slov - Plzeňský Barcamp 2015Analýza klíčových slov - Plzeňský Barcamp 2015
Analýza klíčových slov - Plzeňský Barcamp 2015
 
Entitní SEO pro eshopy | RobertNemec.com
Entitní SEO pro eshopy | RobertNemec.comEntitní SEO pro eshopy | RobertNemec.com
Entitní SEO pro eshopy | RobertNemec.com
 
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
 
WordCamp Bratislava 2017 - Martin Hlaváč
WordCamp Bratislava 2017 - Martin HlaváčWordCamp Bratislava 2017 - Martin Hlaváč
WordCamp Bratislava 2017 - Martin Hlaváč
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware Houdiny
 
Automatizace jednodušše (6. sraz přátel Symfony v Praze)
Automatizace jednodušše (6. sraz přátel Symfony v Praze)Automatizace jednodušše (6. sraz přátel Symfony v Praze)
Automatizace jednodušše (6. sraz přátel Symfony v Praze)
 
Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)
Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)
Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)
 
Optimalizace Symfony na devu
 Optimalizace Symfony na devu Optimalizace Symfony na devu
Optimalizace Symfony na devu
 
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
 
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQueryData Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
 
WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory
WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzoryWebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory
WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory
 
openMagazin 1/2009
openMagazin 1/2009openMagazin 1/2009
openMagazin 1/2009
 
Příručka Aimtečáka 1.01
Příručka Aimtečáka 1.01Příručka Aimtečáka 1.01
Příručka Aimtečáka 1.01
 
JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017
 
Usnadněte si soužití s Doctrine
Usnadněte si soužití s DoctrineUsnadněte si soužití s Doctrine
Usnadněte si soužití s Doctrine
 

Plus de Péhápkaři

Plus de Péhápkaři (20)

Startup vs korporace vs Previo
Startup vs korporace vs PrevioStartup vs korporace vs Previo
Startup vs korporace vs Previo
 
RabbitMQ a ElasticSearch v Previu
RabbitMQ a ElasticSearch v PreviuRabbitMQ a ElasticSearch v Previu
RabbitMQ a ElasticSearch v Previu
 
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
 
Čtvrtkon #53 - Štěpán Zikmund
Čtvrtkon #53 - Štěpán ZikmundČtvrtkon #53 - Štěpán Zikmund
Čtvrtkon #53 - Štěpán Zikmund
 
Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...
Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...
Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...
 
Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)
Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)
Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)
 
PHP Evening #1 - Automatizace [Jan Klat]
PHP Evening #1 - Automatizace [Jan Klat]PHP Evening #1 - Automatizace [Jan Klat]
PHP Evening #1 - Automatizace [Jan Klat]
 
PHP Evening #1 - Propel ORM [Martin Sojka]
PHP Evening #1 - Propel ORM [Martin Sojka]PHP Evening #1 - Propel ORM [Martin Sojka]
PHP Evening #1 - Propel ORM [Martin Sojka]
 
Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...
Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...
Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...
 
Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...
Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...
Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...
 
Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...
Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...
Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...
 
Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy (11. sraz přátel ...
Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy  (11. sraz přátel ...Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy  (11. sraz přátel ...
Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy (11. sraz přátel ...
 
Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...
Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...
Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...
 
Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...
Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...
Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...
 
Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)
Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)
Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)
 
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
 
Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)
Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)
Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
 
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
 
Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)
Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)
Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)
 

Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)