php

PHP Lezione Avanzata – Classi Astratte

Classi Astratte

L’Astrazione dei Dati viene utilizzata per gestire al meglio la complessità di un programma, ovvero viene applicata per decomporre sistemi software complessi in componenti più piccoli e semplici.

Creando un esempio semplice.

Class: Animale
Metodi: mangia() respira() peso() altezza() e tutto quello che può caratterizzare un animale

Bisognerebbe però definire le singole istanze $cane = new Animale(); $gatto = new Animale(); etc…
In questo caso non possiamo creare infinite istanze per ogni tipo di animale, quindi Animale è una Classe Astratta, cioè una classe che non può essere istanziata. L’unica cosa a cui ci può servire è per ottenere delle classi derivate più specifiche.

La struttura sarà la seguente:

Class: Animale
1/2 Metodi + Motodi Astratti che sono solo una definizione del metodo stesso

Class: Cane
fornisce obbligatoriamente l’implementazione dei Metodi Astratti

Class: Gatto
fornisce obbligatoriamente l’implementazione dei Metodi Astratti

etc…

In PHP utilizziamo la keyword ‘abstract’

LA CLASSE ASTRATTA


// Team A - Class Product
abstract class Product {
 
    // proprietà pubbliche
    public $name;
    public $price;
 
    // metodi pubblici
    public function __construct($name, $price) {
        $this->name = $name;
        $this->price = $price;   
    }
     
    public function getName() {
        return $this->name;
    }
     
    public function getPrice() {
        return $this->price;
    }
 
    // metodi astratti contengono SOLO delle definizioni
    abstract public function buyProduct($pid, $quantity);
    abstract public function sellProduct($pid, $quantity);
 
}

LE CLASSI CHE ESTENDONO LA CLASSE ATRATTA


// Team B - Class InProduct
class InProduct extends Product {
 
    public function buyProduct($pid, $quantity) {
     
        // connettiamoci al nostro database locale per ottenere i prodotti che dobbiamo comprare con la quanità indicata...
        $prods = connect_to_my_local_db($db->login(), $quantity);
        $prods->sendmail("buy");
         
        // ...
     
    }
     
    public function sellProduct($pid, $quantity) {
     
        // connettiamoci al nostro database locale per ottenere i prodotti che dobbiamo vendere con la quanità indicata...
        $prods = connect_to_my_local_db($db->login(), $quantity);
        $prods->sendmail("sell");
         
        // ...
     
    }
 
}
 
 
// Team C - Class OutProduct
class OutProduct extends Product {
 
    public function buyProduct($pid, $quantity) {
     
        // connettiamoci al database del partner per ottenere i prodotti che dobbiamo comprare con la quanità indicata...
        $prods = connect_to_partner_db($db->login(), $quantity);
        $prods->sendmail("buy");
         
        // ...
     
    }
     
    public function sellProduct($pid, $quantity) {
     
        // connettiamoci al database del partner per ottenere i prodotti che dobbiamo vendere con la quanità indicata...
        $prods = connect_to_partner_db($db->login(), $quantity);
        $prods->sendmail("sell");
         
        // ...
     
    }
 
}

Ciò che è importante capire, è che nonostante le classi InProduct ed OutProduct siano create da diversi team di sviluppo, esse assumono una forma comune, coerente con quella indicata dalla classe astratta Product.

Se volessi creare un’API:


$pen = new InProduct("penna", 3.50);
$pencil = new OutProduct("matita", 3.50);
 
// vendiamo la penna
$pen->sellProduct(1102, 1);
 
// compriamo una matita
$pencil->buyProduct(3498, 1);

Come funziona?
1. $pen = new InProduct(“penna”, 3.50); – creo un’istanza di class InProduct extends Product {

2. $pen->sellProduct(1102, 1); – invoca public function sellProduct($pid, $quantity)

3. $pid, $quantity è comune a – function sellProduct($pid, $quantity) – che risalendo estende – extends Product – che risalendo definisce – abstract public function sellProduct($pid, $quantity);

4. idem per – buyProduct($pid, $quantity) – che deve avere ($pid, $quantity) – perchè così indicato da – abstract public function buyProduct($pid, $quantity);

Il mio sito ufficiale:
www.lucedigitale.com

Bigliografia:
www.html.it/pag/18355/utilizzare-le-classi-astratte/

By |PHP, Web Design|Commenti disabilitati su PHP Lezione Avanzata – Classi Astratte

Symfony – Simple Registration Form – Doctrine

Creare un semplice form di registrazione con Symfony e Doctrine.
Il form è funzionante e pronto all’uso.

0. Se è la prima volta che utilizziamo il DB, procediamo con il setup come mostrato nella lezione precedente a:
www.lucedigitale.com/blog/symfony-databases-and-the-doctrine-orm/

1. Creiamo il Database da PhpMyAdmin:

Database: test_project
Tabella: app_users
Campi:
– Id char(11) AUTO_INCREMENT
– username char (25) UNIQUE
– password char (60) UNIQUE
– email char (60) UNIQUE

2. Creiamo l’entità User in src/AppBundle/Entity/User.php


<?php

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

use Doctrine\ORM\Mapping as ORM; // uso Doctrine

use Symfony\Component\Validator\Constraints as Assert; // Uso la validazione
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; // Uso la validazione

use Symfony\Component\Security\Core\User\UserInterface;// usa il sistema Symfony per gestire gli utenti

/**
 * @ORM\Entity
 * @ORM\Table(name="app_users")
 * @UniqueEntity(fields="email", message="Email already taken")
 * @UniqueEntity(fields="username", message="Username already taken")
 */
class User implements UserInterface// aggiungi i metodi seguenti alla classe UserInterface di Symfony
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, unique=true)
     * @Assert\NotBlank()
     * @Assert\Email()
     */
    private $email;

    /**
     * @ORM\Column(type="string", length=255, unique=true)
     * @Assert\NotBlank()
     */
    private $username;

    /**
     * @Assert\NotBlank()
     * @Assert\Length(max=4096)
     */
    private $plainPassword; // la password in chiaro, non è salvata nel DB, infatti non abbiamo @ORM ma solo una validazione

    /**
     * The below length depends on the "algorithm" you use for encoding
     * the password, but this works well with bcrypt.
     *
     * @ORM\Column(type="string", length=64)
     */
    private $password; // la password criptata con bcript

    // other properties and methods
    // metodi GET e SET necessari per il funzionamento del form di Symfony

    public function getEmail()
    {
        return $this->email;
    }

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

    public function getUsername()
    {
        return $this->username;
    }

    public function setUsername($username)
    {
        $this->username = $username;
    }

    public function getPlainPassword()
    {
        return $this->plainPassword;
    }

    public function setPlainPassword($password)
    {
        $this->plainPassword = $password;
    }

    public function getPassword()
    {
        return $this->password;
    }

    public function setPassword($password)
    {
        $this->password = $password;
    }

    // ritorna NULL percho bcrypt gestisce il seme per criptare le password
    public function getSalt()
    {
        // The bcrypt algorithm doesn't require a separate salt.
        // You *may* need a real salt if you choose a different encoder.
        return null;
    }

    // other methods, including security methods like getRoles()
    
    public function getRoles()// i ruoli concessi all'utente
    {
        return array('ROLE_USER');
    }

    public function eraseCredentials()// rimuove i dati sensibili dell'utente
    {
    }
    
    // Serialize
    // Alla fine di ogni - request - l'oggetto User viene trasformato in un array (serialize) e salvato nella sessione
    // Alla richiesta successiva viene ricaricato dalla sessione e riconvertito (unserialize)
    /** @see \Serializable::serialize() */
    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->username,
            $this->password,
            // see section on salt below
            // $this->salt,
        ));
    }

    /** @see \Serializable::unserialize() */
    public function unserialize($serialized)
    {
        list (
            $this->id,
            $this->username,
            $this->password,
            // see section on salt below
            // $this->salt
        ) = unserialize($serialized);
    }
}// END Class

Come funziona?

Indico a Symfony dove trovare questo file che contiene la classe che sarà caricata come namespace


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

Carico i namespace


use Doctrine\ORM\Mapping as ORM; // uso Doctrine

use Symfony\Component\Validator\Constraints as Assert; // Uso la validazione
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; // Uso la validazione

use Symfony\Component\Security\Core\User\UserInterface;// usa il sistema Symfony per gestire gli utenti

Aggiungo i metodi alla classe UserInterface di Symfony


class User implements UserInterface...

Dichiaro le proprietà della classe e le loro caratteristiche SQL


     /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

Metodi GET e SET necessari a Symfony


public function getEmail()
    {
        return $this->email;
    }

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

Altre note:

getSalt() – non serve per il bcrypt ma va esplicitata obbligatoriamente o ritorna errore
getRoles() – anche se NULL va esplicitata obbligatoriamente o ritorna errore
eraseCredentials() – anche se NULL va esplicitata obbligatoriamente o ritorna errore

$plainPassword – non viene salvata nel DB ma solo validata @Assert\NotBlank() …

3. Modifichiamo app/config/security.yml, configuro i parametri di security per puntare a User.php e al DB app_users

In particolare notiamo:

– encoders: AppBundle\Entity\User: algorithm: bcrypt
-> usa l’algoritmo bcrypt per criptare la password

– app_users: entity: class: AppBundle:User property: username
-> come gli utenti vengono caricati tradotto -> ‘nometabella’: in ‘AppBundle/Entity/User.php’ proprietà ‘username’


# To get started with security, check out the documentation:
# http://symfony.com/doc/current/security.html

# app/config/security.yml
security:
    encoders:
        AppBundle\Entity\User:
            algorithm: bcrypt

    # http://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
    providers:
        in_memory:
            memory: ~
        app_users:
            entity:
                class: AppBundle:User
                property: username
                # if you're using multiple entity managers
                # manager_name: customer

    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            anonymous: ~
            # activate different ways to authenticate
            pattern:    ^/
            http_basic: ~
           

            # http://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
            #http_basic: ~

            # http://symfony.com/doc/current/cookbook/security/form_login_setup.html
            #form_login: ~

4. Creiamo in src/AppBundle/Form/UserType.php il form come classe in modo che sia riusabile con facilità


<?php

// src/AppBundle/Form/UserType.php
namespace AppBundle\Form;

// carico User.php
use AppBundle\Entity\User;

// carico i namespace per il creare il form
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;

class UserType extends AbstractType // Estende la classe Symfony AbstractType{} 
{
    public function buildForm(FormBuilderInterface $builder, array $options) // metodo di AbstractType{}
    {
        $builder
            ->add('email', EmailType::class) // la casella email
            ->add('username', TextType::class) // la casella username
            // la casella password e repeat password    
            ->add('plainPassword', RepeatedType::class, array(
                'type' => PasswordType::class,
                'first_options'  => array('label' => 'Password'),
                'second_options' => array('label' => 'Repeat Password'),
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => User::class,
        ));
    }
}

5. Creiamo il controller per renderizzare il form a src/AppBundle/Controller/RegistrationController.php


<?php

// src/AppBundle/Controller/RegistrationController.php
namespace AppBundle\Controller;

use AppBundle\Form\UserType;// UserType.php
use AppBundle\Entity\User; // User.php

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; // @Route

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Symfony\Component\HttpFoundation\Request;

class RegistrationController extends Controller
{
    /**
     * @Route("/register", name="user_registration")
     */
    public function registerAction(Request $request)
    {
        // 1) build the form
        $user = new User(); // istanziamo l'oggetto di User.php
        $form = $this->createForm(UserType::class, $user);

        // 2) controlla se il bottone - submit - è stato premuto
        $form->handleRequest($request);
        
        // se l'oggetto user è submit AND validato
        if ($form->isSubmitted() && $form->isValid()) {

            // 3) Encode the password (you could also do this via Doctrine listener)
            $password = $this->get('security.password_encoder')
                ->encodePassword($user, $user->getPlainPassword());
            $user->setPassword($password);

            // 4) save the User!
            $em = $this->getDoctrine()->getManager();
            $em->persist($user);// prepara in cache i dati
            $em->flush(); // scrivi i dati nel DB

            // ... do any other work - like sending them an email, etc
            // maybe set a "flash" success message for the user

             return $this->redirect('http://symfony.com');
        }

        return $this->render(
            'registration/register.html.twig',
            array('form' => $form->createView())
        );
    }
}

6. Creiamo il Template app/Resources/views/registration/register.html.twig


{# app/Resources/views/registration/register.html.twig #}

{{ form_start(form) }}
    {{ form_row(form.username) }}
    {{ form_row(form.email) }}
    {{ form_row(form.plainPassword.first) }}
    {{ form_row(form.plainPassword.second) }}

    <button type="submit">Register!</button>
{{ form_end(form) }}

7. Puntiamo il browser a: http://localhost/symfonytest/first_test_symfony/web/register

Il form in automatico restituirà un messaggio di errore all’utente se:
– username è già stato preso
– email è già stata presa
– password è già stata presa
– password e repeat password non sono uguali

Il mio sito ufficiale:
lucedigitale.com

Bibliografia:
symfony.com/doc/current/doctrine/registration_form.html

By |MySQL, PHP, Symfony, Web Design|Commenti disabilitati su Symfony – Simple Registration Form – Doctrine

Symfony – Load Security Users from the Database – Doctrine

Caricare gli utenti attivi da un database con Symfony e Doctrine.
Il codice è solo teorico, non è pronto all’uso.
Vedere la lezione successiva ‘Symfony – Simple Registration Form – Doctrine’ per testare del codice pronto all’uso.

1. Creiamo il Database da PhpMyAdmin:

Database: test_project
Tabella: app_users
Campi:
– Id char(11) AUTO_INCREMENT
– username char (25) UNIQUE
– password char (60) UNIQUE
– email char (60) UNIQUE
– is_active BOOLEAN -> se l’utente è abilitato

2. Creiamo l’entità src/AppBundle/Entity/User.php


<?php

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

// namespace per usare Doctrine
use Doctrine\ORM\Mapping as ORM; 
// namespace per gestire gli Utenti e ottenere le password criptate
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Table(name="app_users")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 */

// implements aggiunge questi metodi a UserInterface di Symfony
class User implements UserInterface, \Serializable
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=25, unique=true)
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=64)
     */
    private $password;

    /**
     * @ORM\Column(type="string", length=60, unique=true)
     */
    private $email;

    /**
     * @ORM\Column(name="is_active", type="boolean")
     */
    private $isActive;

    public function __construct()
    {
        $this->isActive = true; // costruttore se l'utente è attivo
        // may not be needed, see section on salt below
        // $this->salt = md5(uniqid(null, true));
    }

    public function getUsername()
    {
        return $this->username;
    }

    // il seme o sale utilizzato per l'encode della password    
    // se uso bcrypt non è necessario perchè gestisce il seme automaticamente, e il metodo ritorna null
    public function getSalt() 
    {
        // you *may* need a real salt depending on your encoder
        // see section on salt below
        return null;
    }

    public function getPassword()
    {
        return $this->password;
    }

    public function getRoles()// i ruli concessi all'utente
    {
        return array('ROLE_USER');
    }

    public function eraseCredentials()// rimuove i dati sensibili dell'utente
    {
    }

    // Serialize
    // Alla fine di ogni - request - l'oggetto User viene trasformato in un array (serialize) e salvato nella sessione
    // Alla richiesta successiva viene ricaricato dalla sessione e riconvertito (unserialize)
    /** @see \Serializable::serialize() */
    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->username,
            $this->password,
            // see section on salt below
            // $this->salt,
        ));
    }

    /** @see \Serializable::unserialize() */
    public function unserialize($serialized)
    {
        list (
            $this->id,
            $this->username,
            $this->password,
            // see section on salt below
            // $this->salt
        ) = unserialize($serialized);
    }
}

3. Modifichiamo app/config/security.yml


# To get started with security, check out the documentation:
# http://symfony.com/doc/current/security.html

# app/config/security.yml
security:
    encoders:
        AppBundle\Entity\User:
            algorithm: bcrypt

    # http://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
    providers:
        in_memory:
            memory: ~
        test_project:
            entity:
                class: AppBundle:User
                property: username
                # if you're using multiple entity managers
                # manager_name: customer

    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            anonymous: ~
            # activate different ways to authenticate
            pattern:    ^/
            http_basic: ~
           

            # http://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
            #http_basic: ~

            # http://symfony.com/doc/current/cookbook/security/form_login_setup.html
            #form_login: ~

Configuro i parametri di security per puntare a User.php


security:
    encoders:
        AppBundle\Entity\User:
            algorithm: bcrypt

...

test-project:
    entity:
         class: AppBundle:User
                property: username

Bibliografia:
symfony.com/doc/current/security/entity_provider.html#security-serialize-equatable
api.symfony.com/3.2/Symfony/Component/Security/Core/User/UserInterface.html#method_getRoles

By |MySQL, PHP, Symfony, Web Design|Commenti disabilitati su Symfony – Load Security Users from the Database – Doctrine

Symfony – PHP Sessions Management

Come gestire con Symfony le variabili di sessione.

Cos’è una PHP Session?

La variabile di sessione di PHP ci permette di salvare temporaneamente le informazioni di navigazione (es: username, color etc…) all’interno del server.
La variabile sarà cancellata alla chiusura del browser.

1. pagina uno che setta le variabili


<?php
// 1. inizializzo la sessione
session_start();

// 2. con la variabile globale $_SESSION assegno alla variabile 'username' il valore 'andrea'
$_SESSION["username"] = "andrea";

Con session_start(); il server assegna al mio PC un codice chiave simile a ‘765487cf34ert8dede5a562e4f3a7e12’ che distruggerà alla chiusura del browser.

Una volta assegnato l’identificativo la variabile e il suo valore saranno salvati sul server, ora potremo recuperare i dati da qualsiasi altra pagina con il codice seguente:

2. pagina due che ottiene le variabili


<?php
// 1. inizializzo la sessione
session_start();

// 2.
echo "Username is " . $_SESSION["username"];
print_r($_SESSION); // debug visualizza tutte le variabili di sessione

// 3. to change a session variable, just overwrite it 
$_SESSION["username"] = "Gianni";

// 4. remove all session variables
session_unset(); 

// 5. destroy the session 
session_destroy();

Symfony PHP Session senza sessioni ereditate (NO Legacy Sessions)

IMPORTANTE:
– NON deve essere già presente una sessione già inizializzata.
– NON utilizzare la sintassi PHP classica, è incompatibile con Symfony!!!

Symfony NON accede direttamente alla funzione globale $_SESSION di php perchè gestiche i dati tramite un oggetto proprietario ‘FlashBag()’ sebbene Symfony salvi anche il contenuto di $_SESSION quando la sessione viene salvata.


<?php

// src/AppBundle/Controller/SessionsTest.php
namespace AppBundle\Controller;

use Symfony\Component\HttpFoundation\Response; // namespace di Symfony per response()
use Symfony\Component\HttpFoundation\Session\Session; // namespace per le sessioni

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;// namespace per utilizzare @Route

class SessionsTest{
    
    /**
    * @Route("/sessiontest")
    */
    public function sessionAction()
    {
        echo 'Test Sessioni INIZIO<br>';
        
        // istanzio la classe di Symfony per le sessioni
        $session = new Session();
        // inizio la sessione
        $session->start();

        // salvo la variabile 'name' con il valore 'Andrea'
        $session->set('name', 'Andrea');
        // ottengo la variabile 'name'
        $username = $session->get('name');
        
        echo  'Username = ' . $username;

        // FlashBag() è un metodo di Symfony per gestire messaggi al visitatore inerenti le sessioni
        // setto un flash messages, assegno a 'notice' il valore 'Profile updated'
        $session->getFlashBag()->add('notice', 'Profile updated');

        // richiamo il messaggio
        //                              -> assegno $message='notice'
        foreach ($session->getFlashBag()->get('notice', array()) as $message) {
            echo '<div class="flash-notice">'.$message.'</div>';
        }
        
        // Renderizza
        /* 
        Test Sessioni INIZIO
        Username = Andrea
        Profile updated
        Test Sessioni FINE
         */
       
        return new Response('Test Sessioni FINE');
    }// END sessionAction()
} // END class SessionsTest {}

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

Symfony PHP Session con sessioni ereditate (YES Legacy Sessions)

Se stiamo lavorando con una sessione aperta da un’applicazione PHP che non utilizza il componente HttpFoundation dovremo aggiungere alla nostra pagina Symfony il componente PhpBridgeSessionStorage che ci permette di utilizzare sessioni ereditate da $_SESSION[] di php classico.


// componenti obbligatori per la gestione delle sessioni
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage;

// configua la sessione ereditata 
ini_set('session.save_handler', 'files');
ini_set('session.save_path', '/tmp');
session_start();

// instanzia la classe Session(istanzia la classe PhpBridgeSessionStorage)
$session = new Session(new PhpBridgeSessionStorage());

// symfony ora è compatibile con la sessione precedente ed inizializzo la sessione
$session->start();

Bibliografia:

Sessioni:
http://symfony.com/doc/current/session.html

Sessioni no Legacy:
symfony.com/doc/current/components/http_foundation/sessions.html

Sessioni with Legacy:
symfony.com/doc/current/components/http_foundation/session_php_bridge.html

By |PHP, Symfony, Web Design|Commenti disabilitati su Symfony – PHP Sessions Management

Symfony for Beginners – Doctrine – Fetch Database

Come prelevare facilmente i dati da un database con Symfony e Doctrine.

1. Creiamo il DB da phpMyAdmin

Name: test_project
Codifica caratteri: utf8mb4_bin

Creiamola tabella: product
– Id integer auto increment
– name char lenght=100
– price decimal scale=2 (10,2)
– description text

NB: phpMyAdmin a volte non imposta correttamente 10,2 convertendolo in automatico in 10,0, in questo caso selezionare il tab SQL e digitale

ALTER TABLE `product` CHANGE `price` `price` DECIMAL(10,2) NOT NULL;

Inseriamo dei prodotti

2. Creiamo la Entity Product in src/AppBundle/Entity/Product.php
Notare che le proprietà di questa classe saranno public o non riuscirò ad accedervi per visualizzare il Fetch del DB.


<?php

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

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product
{
    
    // -------------------------------------------------------------------------    
    // Proprietà ---------------------------------------------------------------
    // -------------------------------------------------------------------------
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    public $name;

    /**
     * @ORM\Column(type="decimal", scale=2)
     */
    public $price;

    /**
     * @ORM\Column(type="text")
     */
    public $description;
    
    // -------------------------------------------------------------------------
    // Metodi ------------------------------------------------------------------
    // -------------------------------------------------------------------------
    public function getId() // ottieni
    {
        return $this->id; // assegna il valore che proviene dall'istanza $this->
    }
 
    public function setId($id) // setta
    {
        $this->id = $id;
    }
    // -------------------------------------------------------------------------
    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 getPrice() // ottieni
    {
        return $this->price; // assegna il valore che proviene dall'istanza $this->
    }
 
    public function setPrice($price) // setta
    {
        $this->price = $price;
    }
    // -------------------------------------------------------------------------
    public function getDescription() // ottieni
    {
        return $this->description; // assegna il valore che proviene dall'istanza $this->
    }
 
    public function setDescription($description) // setta
    {
        $this->description = $description;
    }
}// end class Product

3. Creiamo il Controller in src/AppBundle/Controller/LoadProduct.php


<?php

// src/AppBundle/Controller/LoadProduct.php
namespace AppBundle\Controller;

use AppBundle\Entity\Product;// Product.php che ho creato io
use Symfony\Bundle\FrameworkBundle\Controller\Controller; // il bundle controller Symfont
use Symfony\Component\HttpFoundation\Response; // namespace di Symfony per response()
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;// namespace per utilizzare @Route


class LoadProduct extends Controller {
    
    /**
    * @Route("/loadproduct")
    */
    public function createAction()
    {
    
    echo ('Carica dal DB');
    // metodo di Doctrine getRepository('AppBundle/Entity/Product.php') -> shortcut -> ('AppBundle:Product')
    // crea lo schema dell'oggetto
    $repository = $this->getDoctrine()->getRepository('AppBundle:Product');
    // cerca per il prezzo - findByNomevariabile(valore) -
    $productExtracted = $repository->findByPrice(12.99);
    var_dump($productExtracted); // renderizza l'array di oggetti creato
    
    // renderizza tutto il contenuto dell'array di oggetti
    for ($i = 0; $i < count($productExtracted); $i++)// conteggia tutto il contenuto
    {
        echo $i . " " . ($productExtracted[$i]->name) . "<br>";
    }
    
    // send var to a template...
    return new Response(
            'End of the Script'
            );
 
    }// END createAction()
    
}// END class Saveproduct

Come funziona?

1. Per utilizzare il DB dobbiamo avere una Entity che fornisca a Symfony uno schema sul quale creare le query.
metodo di Doctrine getRepository(‘AppBundle:Product’) -> che è l’equivalenmte di -> getRepository((‘AppBundle/Entity/Product.php’)

$repository = $this->getDoctrine()->getRepository('AppBundle:Product');

2. Ora basta lanciare le query con la sintassi findByNomevariabile(valore) dove findBy è la keyword

$productExtracted = $repository->findByPrice(12.99); 

$productExtracted = un array di oggetti, gli oggetti sono le singole colonne del database

3. Renderizza


Carica dal DB
C:\wamp64\www\symfonytest\first_test_symfony\src\AppBundle\Controller\LoadProduct.php:26:
array (size=2)
  0 => 
    object(AppBundle\Entity\Product)[307]
      public 'id' => int 36
      public 'name' => string 'USB Pen Sandisk' (length=15)
      public 'price' => string '12.99' (length=5)
      public 'description' => string 'Ergonomic and stylish!' (length=22)
  1 => 
    object(AppBundle\Entity\Product)[309]
      public 'id' => int 30
      public 'name' => string 'USB Pen Kingston' (length=16)
      public 'price' => string '12.99' (length=5)
      public 'description' => string 'Ergonomic and stylish!' (length=22)

0 USB Pen Sandisk
1 USB Pen Kingston

End of the Script

By |MySQL, PHP, Symfony, Web Design|Commenti disabilitati su Symfony for Beginners – Doctrine – Fetch Database