Diferència entre revisions de la pàgina «A2- Framework de capes per a DDBB (20h)»

De wikiserver
Dreceres ràpides: navegació, cerca
Línia 89: Línia 89:
 
El '''nom de la taula és opcional''' i si ho omets, es genera automàticament en funció del nom de la classe PHP.
 
El '''nom de la taula és opcional''' i si ho omets, es genera automàticament en funció del nom de la classe PHP.
  
Pots consultar la documentació oficial de Doctrine sobre el [[http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html mapeig]]. Tingues en compte que en la documentació de Doctrine no s'explica que si utilitzes anotacions, has de prefixar-les totes amb la cadena '''ORM\ '''(per exemple, '''ORM\Column(...))'''. Igualment, no t'oblidis d'afegir la declaració '''use Doctrine\ORM\Mapping as ORM;''' al principi de les teves classes per importar el prefix '''ORM\'''.
+
Pots consultar la documentació oficial de Doctrine sobre el [http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html mapeig]. Tingues en compte que en la documentació de Doctrine no s'explica que si utilitzes anotacions, has de prefixar-les totes amb la cadena '''ORM\ '''(per exemple, '''ORM\Column(...))'''. Igualment, no t'oblidis d'afegir la declaració '''use Doctrine\ORM\Mapping as ORM;''' al principi de les teves classes per importar el prefix '''ORM\'''.
  
 
Consulta la secció '''Quoting reserved words''' de la documentació de Doctrine per conèixer la llista completa de paraules reservades.
 
Consulta la secció '''Quoting reserved words''' de la documentació de Doctrine per conèixer la llista completa de paraules reservades.
  
 +
 +
===Generant getters i setters===
 +
 +
Recordem la classe Product que havíem creat:
 +
<source lang="php">
 +
// src/Acme/StoreBundle/Entity/Product.php
 +
namespace Acme\StoreBundle\Entity;
 +
 +
class Product
 +
{
 +
    protected $name;
 +
 +
    protected $price;
 +
 +
    protected $description;
 +
}
 +
</source>
  
  

Revisió del 13:59, 9 març 2015

Doctrine

Una de les tasques més comunes i desafiadores per a qualsevol aplicació implica la persistència i la lectura d'informació cap a i des d'una base de dades. Encara que el framework Symfony no integra cap ORM per defecte, l'edició estàndard de Symfony, que és la distribució més utilitzada, ve integrada amb Doctrine, una biblioteca, l'únic objectiu de la qual és donar eines poderoses per fer-ho fàcil.

La llibreria Doctrine proporciona eines per simplificar l'accés i maneig de la informació de la base de dades.

La millor manera per explicar el framework doctrine és mitjançant exmples. Per aixó, es configura l'accés a la base de dades amb doctrine i s'exemplificarà amb la creació d'un objecte anomenat Product.

Configuracio de Doctrine i la Base de Dades

Ès necessari configurar la informació per accedir a la base de dades. Per convenció, aquesta informació es configura en l'arxiu app/config/parameters.yml:

# app/config/parameters.yml
parameters:
    database_driver:   pdo_mysql
    database_host:     localhost
    database_name:     test_project
    database_user:     root
    database_password: password

Ara que doctrine ja coneix l'usuari, la contrasenya i la Base de Dades a utilitzar, pots crear-la amb la següent comanda:

$ php app/console doctrine:database:create

Creant una classe Entity

Imagina que estàs desenvolupant una aplicació en la qual vas a mostrar productes. Oblidant-te de Doctrine i de les bases de dades, segurament estàs pensant a utilitzar un objecte Product per representar als productes. Crea aquesta classe dins del directori Entity del bundle AcmeStoreBundle:

// src/Acme/StoreBundle/Entity/Product.php
namespace Acme\StoreBundle\Entity;
 
class Product
{
    protected $name;
 
    protected $price;
 
    protected $description;
}

És una classe molt senzilla que només s'utilitza per emmagatzemar dades. Encara que es tracta d'una classe molt bàsica, compleix el seu objectiu de representar als productes de la teva aplicació. No obstant això, aquesta classe no es pot guardar en una base de dades — és només una classe PHP simple.

Podràs generar les classes de tipus entitat més fàcilment amb la següent comanda. Una vegada executat, Doctrine et farà diverses preguntes per generar l'entitat de forma interactiva:

$ php app/console doctrine:generate:entity

Mapeig d'objectes PHP a tables de BD

En comptes de treballar amb files i taules, Doctrine et permet guardar i obtenir objectes sencers a partir de la informació de la base de dades. El truc perquè això funcioni consisteix en mapear una classe PHP a una taula de la base de dades i després, mapear les propietats de la classe PHP a les columnes d'aquesta taula:

Php-bd.png

Només has d'afegir algunes metadades a la classe PHP per configurar com es mapean la classe Product i les seves propietats. Aquestes metadades es poden configurar en arxius YAML, XML o directament mitjançant anotacions a la pròpia classe PHP:

// src/Acme/StoreBundle/Entity/Product.php
namespace Acme\StoreBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
 
    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $name;
 
    /**
     * @ORM\Column(type="decimal", scale=2)
     */
    protected $price;
 
    /**
     * @ORM\Column(type="text")
     */
    protected $description;
}

El nom de la taula és opcional i si ho omets, es genera automàticament en funció del nom de la classe PHP.

Pots consultar la documentació oficial de Doctrine sobre el mapeig. Tingues en compte que en la documentació de Doctrine no s'explica que si utilitzes anotacions, has de prefixar-les totes amb la cadena ORM\ (per exemple, ORM\Column(...)). Igualment, no t'oblidis d'afegir la declaració use Doctrine\ORM\Mapping as ORM; al principi de les teves classes per importar el prefix ORM\.

Consulta la secció Quoting reserved words de la documentació de Doctrine per conèixer la llista completa de paraules reservades.


Generant getters i setters

Recordem la classe Product que havíem creat:

// src/Acme/StoreBundle/Entity/Product.php
namespace Acme\StoreBundle\Entity;
 
class Product
{
    protected $name;
 
    protected $price;
 
    protected $description;
}