martin zeman - moje první aplikace v symfony 3 (4. sraz přátel symfony v praze)
TRANSCRIPT
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ývojwebový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 developerTohle 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 installerx
Composer
Composer zní sexy!
composer create-projectsymfony/framework-standard-edition
my_project_name
Co to udělá?
composer create-projectsymfony/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ávky3. 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šíkuOdkaz 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 logoutOdkazy 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: Symfony\Component\Security\Core\User\User: 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. ;)
\AppBundle\Factory\FormFactory
\AppBundle\Factory\FormFactory
__construct( FormFactoryInterface $form_factory, RequestStack $request_stack)
createAndHandle($name, $type, IEntity $entity)
\AppBundle\Entity\IEntity
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: AppBundle\Factory\FormFactory autowire: true
Jdeme tvořit formulář!!!\^.^/
\AppBundle\Form\ProductFormType
\AppBundle\Form\ProductFormType
__construct(array $sizes)
\AppBundle\Form\ProductFormType
$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: AppBundle\Form\ProductFormType 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ánaCartItemEntity
Takže si jí teď vytvoříme. :)
\AppBundle\Entity\CartItemEntity
\AppBundle\Entity\CartItemEntity
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ář!!!\^.^/
\AppBundle\Form\OrderFormType
\AppBundle\Form\OrderFormType
$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.
\AppBundle\Entity\OrderEntity
\AppBundle\Entity\OrderEntity
/*** @Doctrine\ORM\Mapping\Entity* @Doctrine\ORM\Mapping\Table(name="s_order")*/
Info pro Doctrine, že se jedná o její entitu, kterámá být v tabulce "s_order".
\AppBundle\Entity\OrderEntity
/** * @Doctrine\ORM\Mapping\Id * @Doctrine\ORM\Mapping\Column(type="integer") * @Doctrine\ORM\Mapping\GeneratedValue(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.
\AppBundle\Entity\OrderEntity
/** @Doctrine\ORM\Mapping\Column(type="string") *//** @Doctrine\ORM\Mapping\Column(type="text", nullable=true) */
Ostatní hodnoty mají jen definovaný typ hodnoty.
\AppBundle\Entity\OrderEntity
/** @Doctrine\ORM\Mapping\Column(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.
\AppBundle\Entity\OrderEntity
/** * @Doctrine\ORM\Mapping\Column(type="string") * @Symfony\Component\Validator\Constraints\Email() */
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/consoledoctrine:schema:create
Už je ale na čase, začítpracovat s nějakými daty.
Pracovat s daty v controlleru je
Prasárna
Proto si na to vytvořímeně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. :)
\AppBundle\Controller\CatalogController
Ještě nespíte?
Tak budeme pokračovat košíkem. ;)
\AppBundle\Controller\CartController
Poslední a závěrečný controller!Admin!
\AppBundle\Controller\AdminController
Slouží pro předání chyby do šablony
Mrtvá metoda, slouží jenjako placeholder.
Mrtvá metoda, slouží jenjako placeholder.
\AppBundle\Controller\AdminController
Jen zavolá metodu na servicea výsledek předá šabloně. Jen zavolá
metodu naservicea 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 vmí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?