Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PFZ workshopday symfony2 slides

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Joshua Thijssen Joshua Thijssen
May 17, 2014
80

PFZ workshopday symfony2 slides

Avatar for Joshua Thijssen

Joshua Thijssen

May 17, 2014
Tweet

Transcript

  1. 2 Joshua Thijssen Freelance consultant, developer and trainer @ NoxLogic

    / TechAdemy Founder of the Dutch Web Alliance. Author of “Mastering the SPL Library” Blog: http://adayinthelifeof.nl Email: [email protected] Twitter: @jaytaph TechAdemy.nl
  2. ➡ 4 avonden (19:00 - 22:00) ➡ dinsdag 10 -

    17 - 24 june & 1 july ➡ 300 euro early bird, 400 euro normaal ➡ https://www.eventbrite.nl/e/tickets- introductie-symfony2-webinar- nederlands-11668148747 3 Symfony2 introduction webinar
  3. 6

  4. 8

  5. . !"" app # !"" AppCache.php # !"" AppKernel.php #

    !"" autoload.php # !"" bootstrap.php.cache # !"" cache # !"" check.php # !"" config # !"" console # !"" logs # !"" phpunit.xml.dist # !"" Resources # %"" SymfonyRequirements.php !"" composer.json !"" composer.lock !"" LICENSE !"" README.md !"" src # %"" Acme !"" UPGRADE.md !"" vendor # !"" autoload.php # !"" bin # !"" composer # !"" doctrine # !"" jms # !"" kriswallsmith # !"" monolog # !"" sensio # !"" swiftmailer # !"" symfony # %"" twig %"" web !"" app_dev.php !"" apple-touch-icon.png !"" app.php !"" bundles !"" config.php !"" favicon.ico %"" robots.txt 9
  6. 10

  7. 11

  8. # app/config/routing.yml blog_index: pattern: /blog defaults: { _controller: AcmeBlogBundle:Blog:index }

    blog_show: pattern: /blog/{slug} defaults: { _controller: AcmeBlogBundle:Blog:show } 16
  9. <?php namespace Noxlogic\GuestbookBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class DefaultController extends Controller {

    public function indexAction($name) { return $this->render('NoxlogicGuestbookBundle:Default:index.html.twig', array('name' => $name)); } } Template name Format Engine Parameters This template can be found at: /src/Noxlogic/GuestbookBundle/views/Default/index.html.twig 18
  10. {% foreach user in users %} <a href=”{{ path(‘user_details’, {

    ‘id’: user.id }) }}”> {{ user.name | capitalize }}</a> {% endfor %} <a href=”{{ url(‘homepage’); }}>Go back to the homepage</a> Use path() for relative URLs Use url() for absolute URLs 21
  11. <?php namespace Noxlogic\GuestbookBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Noxlogic\GuestbookBundle\Form\CommentType; class CommentController extends

    Controller { public function indexAction() { $form = $this->createFormBuilder() ->add('name', 'text') ->add('email', 'email') ->add('comment', 'textarea') ->getForm(); return $this->render('NoxlogicGuestbookBundle:Comment:index.html.twig', array('form' => $form->createView())); } } 23
  12. <?php namespace Noxlogic\GuestbookBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; class CommentType extends

    AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name'); $builder->add('email', 'email'); $builder->add('comment', 'textarea'); } public function getName() { return 'comment'; } } src/Noxlogic/GuestbookBundle/Form/ CommentType.php 24 Move the form to its own class
  13. <?php namespace Noxlogic\GuestbookBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Noxlogic\GuestbookBundle\Form\CommentType; class CommentController extends

    Controller { public function indexAction() { $form = $this->createForm(new CommentType()); return $this->render('NoxlogicGuestbookBundle:Comment:index.html.twig', array('form' => $form->createView())); } } src/Noxlogic/GuestbookBundle/Controller/CommentController.php 25 Keeps the controllers small and clean.
  14. ➡ We can add validators to our form(entries). ➡ isValid()

    will check form values, and create errors which can be displayed with the form_errors() twig function. 28
  15. <?php namespace Noxlogic\GuestbookBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Validator\Constraints; class

    CommentType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name', 'text', array( 'constraints' => new Constraints\NotBlank(), )); $builder->add('email', 'email'); $builder->add('comment', 'textarea', array( 'constraints' => array( new Constraints\NotBlank(), new Constraints\Length(array('min' => 10, 'max' => 50)), ) )); } public function getName() { return 'comment'; } } 29
  16. ➡ NotBlank ➡ Blank ➡ NotNull ➡ Null ➡ True

    ➡ False ➡ Type ➡ Email ➡ MinLength ➡ MaxLength ➡ Length ➡ Url ➡ Regex ➡ Ip ➡ Max ➡ Min ➡ Range ➡ Date ➡ DateTime ➡ Time ➡ Choice ➡ Collection ➡ Count ➡ UniqueEntity ➡ Language ➡ Locale ➡ Country ➡ File ➡ Image ➡ Callback ➡ All ➡ UserPasswor d ➡ Valid 30
  17. <?php namespace Noxlogic\GuestbookBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Validator\Constraints; class

    CommentType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name', 'text', array( 'constraints' => new Constraints\NotBlank(), )); $builder->add('email', 'email'); $builder->add(‘country’, ‘country’); $builder->add('comment', 'textarea', array( 'constraints' => array( new Constraints\NotBlank(), new Constraints\Length(array('min' => 10, 'max' => 50)), ) )); } public function getName() { return 'comment'; } } 31
  18. ➡ Validations etc can be added to configuration to simplify

    things. ➡ Normally, validation is done on “entities”. 32
  19. 33 ➡ As with (almost) anything, you can write your

    custom validators as well. ➡ Check for valid customer-id, ISBN, VAT numbers etc..
  20. ➡ Form data is usually coupled to models/ entities ➡

    Doctrine2, but standalone models are possible too. 35
  21. <?php namespace NoxLogic\GuestbookBundle\Entity; class Comment { protected $name; protected $email;

    protected $comment; // getters and setters getName(), setName() etc.. } 36
  22. <?php namespace Noxlogic\GuestbookBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Noxlogic\GuestbookBundle\Form\CommentType; use Noxlogic\GuestbookBundle\Entity\Comment; class

    CommentController extends Controller { public function indexAction() { $comment = new Comment(); $form = $this->createForm(new CommentType(), $comment); $request = $this->getRequest(); if ($request->getMethod() == "POST") { $form->handleRequest($request); // $comment is now filled with our form values if ($form->isValid()) { $this->get("session")->setFlash("notice", "Thank you for posting your comment!"); $url = $this->generateUrl("noxlogic_guestbook_homepage", array("name" => $comment->getName())); return $this->redirect($url); } } return $this->render('NoxlogicGuestbookBundle:Comment:index.html.twig', array( 'form' => $form->createView()) ); } } 37
  23. use Doctrine\ORM\Mapping AS ORM; /** @ORM\Entity */ class User {

    /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type=”integer”) */ protected $id; /** @ORM\Column(type=”string”, length=25); protected $firstname; /** @ORM\Column(type=”string”, length=25); protected $lastname; /** @ORM\Column(type=”string”, length=50); protected $email; /** @ORM\Column(type=”date”); protected $birthdate; } 40
  24. public function indexAction() { $user = new User(); $user->setFirstName(“John”); $user->setLastName(“Doe”);

    $user->setBirthdate(new \DateTime(“1 august 1980”)); $em = $this->getDoctrine()->getManager(); $em->persist($user); $em->flush(); } 42
  25. public function indexAction() { $user = $this->getDoctrine() ->getRepository(“NoxlogicBundle:User”) ->find(1); if

    (!$user) { throw new \HttpNotFoundException(); } $this->render(“myview.html”, array(“user” => $user)); } 43
  26. ➡ Repositories provides ways to find / query for your

    entities. ➡ Standard repository: ➡ fetchAll, fetchOne, fetchAllBy*, fetchOneBy* 45