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