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

Post on 16-Apr-2017

690 views 3 download

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?