Come creare un semplice form Sign In ed ottenere i dati in JSon

Il template .twig in app/Resources/views/default/new.html.twig


{# app/Resources/views/default/new.html.twig #}
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

L’entità in src/AppBundle/Entity/Person.php


<?php

// src/AppBundle/Entity/Person.php
namespace AppBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert; // serve per @Assert\...

class Person // dichiarazione esplicita dell'oggetto
{
    // -------------------------------------------------------------------------    
    // Proprietà ---------------------------------------------------------------
    // -------------------------------------------------------------------------
    
    /**
     * @Assert\NotBlank()
     */
    public $name;    
     /**
     * @Assert\NotBlank()
     */
    public $surname; 
    /**
     * @Assert\Email(
     *     message = "The email '{{ value }}' is not a valid email.",
     *     checkMX = true
     * )
     */
    public $email; 
    
    // -------------------------------------------------------------------------
    // Metodi ------------------------------------------------------------------
    // -------------------------------------------------------------------------
    
    // NB metodi get e set obbligatori per permettere a 'Form component' di symfony di funzionare correttamente
    public function getName() // ottieni
    {
        return $this->name; // assegna il valore che proviene dall'istanza $this->
    }

    public function setName($name) // setta
    {
        $this->name = $name;
    }
    
    // -------------------------------------------------------------------------

    public function getSurname() // ottieni 
    {
        return $this->surname;
    }

    public function setSurname($surname) // setta 
    {
        $this->surname = $surname;
    }
    
    // -------------------------------------------------------------------------
    
     public function getEmail() // ottieni 
    {
        return $this->email;
    }

    public function setEmail($email) // setta 
    {
        $this->email = $email;
    }
    
    // -------------------------------------------------------------------------
}

La classe SignIn in src/AppBundle/Controller/SignIn.php


<?php

// src/AppBundle/Controller/SignIn.php
namespace AppBundle\Controller;
 
use AppBundle\Entity\Person; // carica Person.php creato da me
use Symfony\Bundle\FrameworkBundle\Controller\Controller; // il bundle controller Symfont
use Symfony\Component\HttpFoundation\Request; // capacità do renderizzare html
use Symfony\Component\Form\Extension\Core\Type\TextType; // form di Symfony
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;// NECESSARIO per utilizzare @Route

class SignIn extends Controller // estende la classe Controller di Symfony
{
    /**
    * @Route("/signin")
    */
    public function signInAction(Request $request)
   {
       // creo il nuovo oggetto 
       $person = new Person();
      
       // 1. creo i contenuti HTML del form
       // invio Andrea, Tonin, andrea@email.it
       $form = $this->createFormBuilder($person)
           ->add('name', TextType::class) // il nome delle varibili è lo stesso di Person.php
           ->add('surname', TextType::class) 
           ->add('email', TextType::class) 
           ->add('save', SubmitType::class, array('label' => 'Create Person'))
           ->getForm();
        
       // 3. riconosce che il form non è stato inviato e non fa nulla
       $form->handleRequest($request); 
        
       // 4. se il form è inviato AND valido
       if ($form->isSubmitted() && $form->isValid()) {
           // $form->getData() holds the submitted values
           // but, the original `$person` variable has also been updated
           $person = $form->getData();// ottieni i dati dal form
           
           // debug START ######################################################
           // Oggetto originale
           var_dump($person);  // mostra l'oggetto
           var_dump($person->name);  // mostra la varianbile name all'interno dell'oggetto
           // Conversione Json - NOTAZIONE JSON - è utile per trasportare i dati all'interno di una stringa
           $personJson = json_encode($person); // oggetto convertito in json format
           var_dump ($personJson); // mostra in json
           // Decodifica JSon - TORNA AD ESSERE UN OGGETTO
           $personDecoded = json_decode($personJson);
           var_dump ($personDecoded);
           var_dump($personDecoded->name);  // mostra la varianbile name all'interno dell'oggetto
           
           // Dummy Data, instanzio la classe inviando dei dati di esempio
            $anotherPerson = new Person();
            $anotherPerson->name = "Erica";
            $anotherPerson->surname = "Tonin";
            $anotherPerson->email = "erica@email.it";
           
           // Array
           $people =[]; // creo un array di persone vuoto
           array_push($people,$anotherPerson); // aggiungo id=0 dell'array
           array_push($people,$person); // aggiungo id=1 dell'array
           var_dump ($people); // visualizza il contenuto dell'array
           var_dump ($people[1]->name); // visualizzerà Andrea, array id 1 chiave name
           
           // altre operazioni con gli array
           // conta gli oggetti all'interno dell'array, visualizzerà 2
           var_dump(count($people)); 
           
           // renderizza tutto il contenuto dell'array di oggetti
           for ($i = 0; $i < count($people); $i++)// conteggia tutto il contenuto
           {
            echo $i . " " . ($people[$i]->name) . " " . ($people[$i]->surname) . " " . ($people[$i]->email) . "<br>";
           }
           
           // renderizza solo ad una particolare condizione
           for ($i = 0; $i < count($people); $i++)// conteggia tutto il contenuto
           {
                if (($people[$i]->name) === 'Erica') // se il valore è identico
                {
                echo 'La email di Erica è: ' . ($people[$i]->email) . "<br>";
                }
           }
           
           die ("Stop Here");  // interrompi qui la funzione
           // debug END ########################################################
       }// END validation
 
       // 2. Il form viene creato e renderizzato
       return $this->render('default/new.html.twig', array(
           'form' => $form->createView(),
       ));
   }   
    
}// END class SignIn

Puntare il browser a: http://localhost/symfonytest/first_test_symfony/web/signin

Inserire i dati ed inviare, verrà stampato a video:


C:\wamp64\www\symfonytest\first_test_symfony\src\AppBundle\Controller\SignIn.php:45:
object(AppBundle\Entity\Person)[316]
  public 'name' => string 'Andrea' (length=6)
  public 'surname' => string 'Tonin' (length=5)
  public 'email' => string 'andrea@email.it' (length=15)

C:\wamp64\www\symfonytest\first_test_symfony\src\AppBundle\Controller\SignIn.php:46:string 'Andrea' (length=6)

C:\wamp64\www\symfonytest\first_test_symfony\src\AppBundle\Controller\SignIn.php:49:string '{"name":"Andrea","surname":"Tonin","email":"andrea@email.it"}' (length=61)

C:\wamp64\www\symfonytest\first_test_symfony\src\AppBundle\Controller\SignIn.php:52:
object(stdClass)[390]
  public 'name' => string 'Andrea' (length=6)
  public 'surname' => string 'Tonin' (length=5)
  public 'email' => string 'andrea@email.it' (length=15)

C:\wamp64\www\symfonytest\first_test_symfony\src\AppBundle\Controller\SignIn.php:53:string 'Andrea' (length=6)

C:\wamp64\www\symfonytest\first_test_symfony\src\AppBundle\Controller\SignIn.php:65:
array (size=2)
  0 => 
    object(AppBundle\Entity\Person)[372]
      public 'name' => string 'Erica' (length=5)
      public 'surname' => string 'Tonin' (length=5)
      public 'email' => string 'erica@email.it' (length=14)
  1 => 
    object(AppBundle\Entity\Person)[316]
      public 'name' => string 'Andrea' (length=6)
      public 'surname' => string 'Tonin' (length=5)
      public 'email' => string 'andrea@email.it' (length=15)

C:\wamp64\www\symfonytest\first_test_symfony\src\AppBundle\Controller\SignIn.php:66:string 'Andrea' (length=6)

C:\wamp64\www\symfonytest\first_test_symfony\src\AppBundle\Controller\SignIn.php:70:int 2

0 Erica Tonin erica@email.it
1 Andrea Tonin andrea@email.it
La email di Erica è: erica@email.it

Stop Here

Come funziona?

1. Istanziata la classe $person = new Person(); e creato l’oggetto $person, vuoto, cone le sole chiavi.

2. Creato il form con il metodo di Symfony createFormBuilder()

3. Renderizzato il form con il metodo di Symfony return $this->render()

4. Invio i dati dal form, il metodo handleRequest($request); verifica che è stato inviato e aggiorna $person

5. Il contenuto di $person viene validato nell’entità Person.php

6. In signIn.php se $person è stato inviato ed è valido: $person = $form->getData();

7. nella sezione di debug gioco un po con i dati:
– mostro il dato come oggetto
– codifico il dato come json
– decodifico il dato da json
– creo un nuovo oggetto istanziando $anotherPerson = new Person();
– creo un array vuoto $people =[]
– inserisco nell’array i 2 oggetti precedentemente creati
– visualizzo i contenuti secondo la sintassi:

$people[1]->name
nomearray[id]->keyword

Il mio sito ufficiale: lucedigitale.com