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

En vedette

commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clustercommit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clusterJakub Kulhan
 
Symfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconSymfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconVojta Svoboda
 
Andrea carolina vargas y miguelangelvargas cardona
Andrea carolina vargas y miguelangelvargas cardonaAndrea carolina vargas y miguelangelvargas cardona
Andrea carolina vargas y miguelangelvargas cardonamiguel956832
 
Llaqta Runaq Rimariynin - Junio 2014
Llaqta Runaq Rimariynin - Junio 2014Llaqta Runaq Rimariynin - Junio 2014
Llaqta Runaq Rimariynin - Junio 2014LlaqtaRunaq
 
Welcome to central web power point
Welcome to central web power pointWelcome to central web power point
Welcome to central web power pointCentral Elementary
 
Glidden at Walmart - NSAC 2013
Glidden at Walmart - NSAC 2013Glidden at Walmart - NSAC 2013
Glidden at Walmart - NSAC 2013Marc Phillips
 
Tui itc hotel botánico
Tui itc hotel botánicoTui itc hotel botánico
Tui itc hotel botánicoRED CIDE Cide
 
PresentacióN Adaptamos Group 2008
PresentacióN Adaptamos Group 2008PresentacióN Adaptamos Group 2008
PresentacióN Adaptamos Group 2008adaptamosgroup
 
Symfony2: Get your project started
Symfony2: Get your project startedSymfony2: Get your project started
Symfony2: Get your project startedRyan Weaver
 
Microservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowMicroservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowJakub Nesetril
 
Bä-Attestation de reussite Monsieur Romain SALESSES (1) 2
Bä-Attestation de reussite Monsieur Romain SALESSES (1) 2Bä-Attestation de reussite Monsieur Romain SALESSES (1) 2
Bä-Attestation de reussite Monsieur Romain SALESSES (1) 2Romain Salesses
 
Correveidile 2012.
Correveidile 2012.Correveidile 2012.
Correveidile 2012.José María
 
Informáguajilin
InformáguajilinInformáguajilin
Informáguajilinlinary
 
Ubyquo tutorial primeros pasos
Ubyquo tutorial primeros pasosUbyquo tutorial primeros pasos
Ubyquo tutorial primeros pasosUBYQUO
 

En vedette (18)

commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clustercommit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
 
Symfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconSymfony vs Nette vs Phalcon
Symfony vs Nette vs Phalcon
 
Deployment talk dpc 13
Deployment talk dpc 13Deployment talk dpc 13
Deployment talk dpc 13
 
Andrea carolina vargas y miguelangelvargas cardona
Andrea carolina vargas y miguelangelvargas cardonaAndrea carolina vargas y miguelangelvargas cardona
Andrea carolina vargas y miguelangelvargas cardona
 
Llaqta Runaq Rimariynin - Junio 2014
Llaqta Runaq Rimariynin - Junio 2014Llaqta Runaq Rimariynin - Junio 2014
Llaqta Runaq Rimariynin - Junio 2014
 
Perfil kenia
Perfil keniaPerfil kenia
Perfil kenia
 
Welcome to central web power point
Welcome to central web power pointWelcome to central web power point
Welcome to central web power point
 
Glidden at Walmart - NSAC 2013
Glidden at Walmart - NSAC 2013Glidden at Walmart - NSAC 2013
Glidden at Walmart - NSAC 2013
 
Tui itc hotel botánico
Tui itc hotel botánicoTui itc hotel botánico
Tui itc hotel botánico
 
PresentacióN Adaptamos Group 2008
PresentacióN Adaptamos Group 2008PresentacióN Adaptamos Group 2008
PresentacióN Adaptamos Group 2008
 
Symfony2: Get your project started
Symfony2: Get your project startedSymfony2: Get your project started
Symfony2: Get your project started
 
Microservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowMicroservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflow
 
Guia de Organos de Participacion Ciudadana
Guia de Organos de Participacion CiudadanaGuia de Organos de Participacion Ciudadana
Guia de Organos de Participacion Ciudadana
 
Bä-Attestation de reussite Monsieur Romain SALESSES (1) 2
Bä-Attestation de reussite Monsieur Romain SALESSES (1) 2Bä-Attestation de reussite Monsieur Romain SALESSES (1) 2
Bä-Attestation de reussite Monsieur Romain SALESSES (1) 2
 
Josep el betlem
Josep el betlemJosep el betlem
Josep el betlem
 
Correveidile 2012.
Correveidile 2012.Correveidile 2012.
Correveidile 2012.
 
Informáguajilin
InformáguajilinInformáguajilin
Informáguajilin
 
Ubyquo tutorial primeros pasos
Ubyquo tutorial primeros pasosUbyquo tutorial primeros pasos
Ubyquo tutorial primeros pasos
 

Similaire à Moje první aplikace v Symfony 3 + překvapení (4. sraz přátel Symfony v Praze)

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...Targito
 
Javascript na steroidech
Javascript na steroidechJavascript na steroidech
Javascript na steroidechseznamVyvojari
 
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 2015Jakub Kašparů
 
Entitní SEO pro eshopy | RobertNemec.com
Entitní SEO pro eshopy | RobertNemec.comEntitní SEO pro eshopy | RobertNemec.com
Entitní SEO pro eshopy | RobertNemec.comRobertNemec.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)Jakub Kulhan
 
WordCamp Bratislava 2017 - Martin Hlaváč
WordCamp Bratislava 2017 - Martin HlaváčWordCamp Bratislava 2017 - Martin Hlaváč
WordCamp Bratislava 2017 - Martin HlaváčBrilo Team
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware HoudinyCESNET
 
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)Péhápkaři
 
Optimalizace Symfony na devu
 Optimalizace Symfony na devu Optimalizace Symfony na devu
Optimalizace Symfony na devuVašek Purchart
 
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)Péhápkaři
 
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 BigQueryTaste
 
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é vzoryMartin Michálek
 
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 2017Michal Blažek
 
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě
 
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 DoctrineFilip Procházka
 

Similaire à Moje první aplikace v Symfony 3 + překvapení (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 [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
 
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
 
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
 

Moje první aplikace v Symfony 3 + překvapení (4. sraz přátel Symfony v Praze)