Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

90 % webových aplikací funguje stylem "získám uživatelská data, uložím si je do nějakého storage a pak si je prohlédnu na bezpečné stránce". Se Symfony 3 je tohle otázka pár minut.

  • Login to see the comments

  • Be the first to like this

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

  1. 1. 4. sraz přátel Symfony - Novoroční posezení Moje první aplikace v Symfony 3 Praha, 28. 1. 2016, Etnetera a.s.
  2. 2. ● 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
  3. 3. 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. :)
  4. 4. Zajímavé
  5. 5. Znáš Symfony?
  6. 6. Jo, Symfony znám!
  7. 7. Používám ho skoro měsíc!
  8. 8. Kde Symfony 3 seženu?
  9. 9. Začal bych u zdroje.
  10. 10. Ale já jsem vývojář! Neexistuje nějaká línější metoda?
  11. 11. Jo, existuje.
  12. 12. Symfony installer x Composer
  13. 13. Composer zní sexy!
  14. 14. composer create-project symfony/framework-standard-edition my_project_name
  15. 15. Co to udělá?
  16. 16. composer create-project symfony/framework-standard-edition my_project_name Hej composer vytvoř projekt do této složky z tohoto balíčku
  17. 17. 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ů.
  18. 18. No a hotovo … Vaše první aplikace je na světě. :-)
  19. 19. ^.^/ Juchůů
  20. 20. Díky za pozornost! Otázky?Ale teď vážně. Co budeme tvořit?
  21. 21. Jednoduchý “e-shop” (hodně jednoduchý …)
  22. 22. Jednoduchý “e-shop” (opravdu hodně jednoduchý …) Máme málo času.
  23. 23. ● 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
  24. 24. Dělám si prdel ;)
  25. 25. 1. Katalog produktů 2. Košík / Dokončení objednávky 3. Zabezpečení 4. Přehled objednávek Co budeme potřebovat?
  26. 26. 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
  27. 27. ● 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
  28. 28. But women are always right!
  29. 29. Formulář “male”Formulář “female” Ano, ale tady budou nalevo.
  30. 30. Obyčejný výpis Odkaz na routu do košíku Flash message
  31. 31. ● 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
  32. 32. Odkaz na routu pro vymazání položky z košíku Odkaz na routu do katalogu Formulář Text ... Obyčejný výpis
  33. 33. ● 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
  34. 34. Ručně sestavený login form Flash message
  35. 35. Admin je jen pro vyvolené! Takže může vypadat hnusně. :D
  36. 36. No fuuuuuuuuj!!!
  37. 37. Proklik na logout Odkazy na tento výpis s parametrem v adrese Výpis z DB Můžete změnit stav!!! :O
  38. 38. Wait … Ještě maily!!!
  39. 39. Pro smrtelníky
  40. 40. Pro nemrtvé
  41. 41. Nevypadá to zle. Co? :)
  42. 42. parameters: locale: cs framework: translator: { fallbacks: ["%locale%"] } twig: form-theme: "bootstrap_3_horizontal_layout.html.twig"
  43. 43. parameters: admin_password: abcd1234 Extrémní zabezpečení!
  44. 44. 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.
  45. 45. security: access_control: - { path: ^/admin, roles: ROLE_ADMIN } Pamatují si všichni routy?
  46. 46. 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
  47. 47. security: firewalls: main: anonymous: ~ form_login: login_path: /login check_path: /login-check logout: path: /logout target: /login
  48. 48. A teď něco, co souvisí s e-shopem.
  49. 49. Nadefinujeme si velikosti triček.
  50. 50. Už by to chtělo nějaký formulář ...
  51. 51. Ok, ale neopičte se! Udělejte si továrničku. ;)
  52. 52. AppBundleFactoryFormFactory
  53. 53. AppBundleFactoryFormFactory __construct( FormFactoryInterface $form_factory, RequestStack $request_stack ) createAndHandle($name, $type, IEntity $entity)
  54. 54. AppBundleEntityIEntity
  55. 55. Továrničku máme hotovou. Dáme si jí do services, ať se nám s ní hezky pracuje. :)
  56. 56. services: app.factory.form_factory: class: AppBundleFactoryFormFactory autowire: true
  57. 57. Jdeme tvořit formulář!!! ^.^/
  58. 58. AppBundleFormProductFormType
  59. 59. AppBundleFormProductFormType __construct(array $sizes)
  60. 60. AppBundleFormProductFormType $builder->add('size', ChoiceType::class, ...); $builder->add('quantity', NumberType::class, ...); $builder->add('submit', SubmitType::class, ...); A šup do DI
  61. 61. 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ář.
  62. 62. Na formulář je navázána CartItemEntity Takže si jí teď vytvoříme. :)
  63. 63. AppBundleEntityCartItemEntity
  64. 64. 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.
  65. 65. A další formulář!!! ^.^/
  66. 66. AppBundleFormOrderFormType
  67. 67. AppBundleFormOrderFormType $builder->add('name', TextType::class, ...); $builder->add('email', EmailType::class, ...); $builder->add('note', TextareaType::class, ...); $builder->add('submit', SubmitType::class, ...);
  68. 68. I na tento formulář je navázána entita. Tentokrát OrderEntity Takže si jí taky vytvoříme.
  69. 69. AppBundleEntityOrderEntity
  70. 70. AppBundleEntityOrderEntity /** * @DoctrineORMMappingEntity * @DoctrineORMMappingTable(name="s_order") */ Info pro Doctrine, že se jedná o její entitu, která má být v tabulce "s_order".
  71. 71. 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.
  72. 72. AppBundleEntityOrderEntity /** @DoctrineORMMappingColumn(type="string") */ /** @DoctrineORMMappingColumn(type="text", nullable=true) */ Ostatní hodnoty mají jen definovaný typ hodnoty.
  73. 73. 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.
  74. 74. AppBundleEntityOrderEntity /** * @DoctrineORMMappingColumn(type="string") * @SymfonyComponentValidatorConstraintsEmail() */ No a pak je tu ještě jedna věc a to je validační pravidlo pro email. :)
  75. 75. Protože se držíme pravidla “code first”, tak si teď necháme dle entity vygenerovat tabulku “s_order”.
  76. 76. Slouží k tomu moc fajn příkaz. :) php bin/console doctrine:schema:create
  77. 77. Už je ale na čase, začít pracovat s nějakými daty.
  78. 78. Pracovat s daty v controlleru je Prasárna
  79. 79. Proto si na to vytvoříme nějakou fajn service.
  80. 80. Co by měla umět? ● pracovat s košíkem ● pracovat s objednávkou
  81. 81. Začneme tvořit controllery. Třeba katalogem. :)
  82. 82. AppBundleControllerCatalogController
  83. 83. Ještě nespíte?
  84. 84. Tak budeme pokračovat košíkem. ;)
  85. 85. AppBundleControllerCartController
  86. 86. Poslední a závěrečný controller! Admin!
  87. 87. AppBundleControllerAdminController Slouží pro předání chyby do šablony Mrtvá metoda, slouží jen jako placeholder. Mrtvá metoda, slouží jen jako placeholder.
  88. 88. AppBundleControllerAdminController Jen zavolá metodu na service a výsledek předá šabloně. Jen zavolá metodu na service a udělá redirect.
  89. 89. security: firewalls: main: anonymous: ~ form_login: login_path: /login check_path: /login-check logout: path: /logout target: /login
  90. 90. Co si z toho odnést?
  91. 91. Méně je více! Nepište zbytečnosti.
  92. 92. Anotace jsou, byly, a budou. Používejte je!
  93. 93. 3. Frameworky pomáhají! Používejte je.
  94. 94. ● Controllery: 3 ● Entity: 2 + 1 interface ● Factory: 1 ● Form: 2 ● View: 4 + 2 mail + 1 layout ● Service: 1 Výsledek
  95. 95. 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?
  96. 96. Toto bylo zde v ukázkách.
  97. 97. Toto již nyní najdete na webu http://www.symfony.cz
  98. 98. https://thewackywordsmith.wordpress.com/ Otázky?

×