[ Tutorial ] Symfony 2 & Doctrine 2 – Como Gerar Uma Entidade

Este tutorial aborda a criação de entidades no Doctrine 2 utilizando anotações.

NOTA:

É obrigatório que você leia a introdução deste tutorial disponível no link http://gilbertoalbino.com/tutorial-symfony-2-e-doctrine-2 e veja a lista com outros tutoriais relacionados.

O que é uma Entidade?

Primeiramente, precisamos definir o que é uma Entidade no SF2xDT2. Uma Entidade (Entity, do inglês) é a representação de uma tabela no banco de dados através de uma classe PHP onde as propriedades desta são as colunas desta tabela que podem ser mapeadas na aplicação.

Criando uma Entidade

IMPORTANTE: Partirei da premissa que as tabelas não foram criadas ainda no banco de dados, pois as criaremos via Doctrine.

Para criar uma Entidade utilizaremos uma linha de comando acessado o diretório do projeto.

php app/console generate:doctrine:entity

Deverá aparecer a mensagem de Boas Vindas do gerador de entidades solicitando que você informe o nome da Entidade.

Gerar Entidade com Doctrine no Symfony 2

Você deverá informar o atalho, que no nosso caso é AcmeDemoBundle concatenando através de dois pontos (:) o nome da entidade, que será Product.
Caso você tenha um Bundle qualquer, por exemplo “Application/Core/AdminBundle“, o mesmo ficaria “ApplicationCoreAdminBundle“.

Digite:

AcmeDemoBundle:Product

E novas informações serão solicitadas.

Para “Configuration format (yml, xml, php, or annotation) [annotation]:“, pressione ENTER e aguarde.

O gerador irá solicitar o nome dos campos.

Toda tabela no Doctrine deve ter um ID como chave primária, logo, por padrão, o mesmo já é gerado, e você não precisa criar este campo. Caso tente, uma mensagem de aviso será disparada.

A criação de campos é bem intuitiva. Você informa o nome do campo para a tabela, tipo e tamanho (caso o tipo solicite). MAS, não criaremos pela linha de comando, faremos diretamente no arquivo para termos uma melhor orientação da utilização das anotações (annotations).

Para “New field name (press to stop adding fields):“, pressione ENTER.

Para “Do you want to generate an empty repository class [no]?“, pressione ENTER.

E por fim, para “Do you confirm generation [yes]?“, também pressione ENTER.

Será gerado um arquivo ( caminho no comentário ) contendo Annotations nos comentários.

// src/Acme/DemoBundle/Entity/Product.php
namespace Acme\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Product
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Product
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
}

Como você já pode intuir, as anotações correspondem à informações que o Doctrine precisará para gerar o SQL necessário para trabalhar com as consultas no banco de dados.
Antes de efetivamente criarmos nossa tabela, digite no terminal a linha de comando a baixo para visualizar o código CREATE atual para a tabela:

php app/console doctrine:schema:update --dump-sql

Você deverá ver algo como:

CREATE TABLE Product (id INT AUTO_INCREMENT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB

A tabela está herdando o nome da Classe Product, que não nos interessa, por isto, vamos alterá-lo, para fazer isto, na Classe Product temos a anotação

* @ORM\Table()

Basta passar a chave name ou simplesmente o nome da tabela.

 * @ORM\Table(name="products") // ou  @ORM\Table("products")

Execute novamente o comando:

php app/console doctrine:schema:update --dump-sql

e veja que o nome foi alterado.

Criando Novas Colunas Na Tabela

Vamos adicionar agora alguns campos pertinentes ao Modelo Produto que estaremos utilizando diretamente do arquivo Product.php.

Os campos serão:

  • name – VARCHAR(155) NOT NULL
  • category – INTEGER(11)
  • description – TEXT
  • price – DECIMAL(6,2)
  • status – TYNINT(1)

Para criarmos estas colunas iremos utilizar a Annotation Column dentro do namespace ORM do Doctrine.

Basicamente, utilizaremos as seguintes propriedades:

@ORM\Column(name, type, length, precision, scale, nullable)

Veja como é facil criar columas para nossa tabela com o Doctrine.

Crie as propriedades e defina as propriedades das Anotações:

Nossa Entidade ficará assim:

// src/Acme/DemoBundle/Entity/Product.php
namespace Acme\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Product
 *
 * @ORM\Table(name="products")
 * @ORM\Entity
 */
class Product
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=155, nullable=false)
     */
    protected $name;

    /**
     * @var string $description
     *
     * @ORM\Column(name="description", type="text")
     */
    protected $description;

    /**
     * @var float $price
     *
     * @ORM\Column(name="price", type="decimal", precision=9, scale=2, nullable=false)
     */
    protected $price;

    /**
     * @var boolean $status
     * @ORM\Column(name="status", type="boolean")
     */
    protected $status;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
}

Excecute novamente o dump para visualizar como ficou o CREATE de nosso SQL.

php app/console doctrine:schema:update --dump-sql

Criando a Tabela Através do Doctrine

Considerando que já criamos todas as propriedades de nossa classe Entidade, vamos agora forçar o Doctrine a criar a tabela física no banco de dados.

Anteriormente, utilizamos o – -dump-sql, e agora basta substituí-lo por – -force e a tabela será criada fisicamente.

php app/console doctrine:schema:update --force

Você terá a estrutura criada, conforme imagem abaixo.

Schema para tabela Products

Getters e Setters

Para que seja possível trabalhar com Entidades é preciso que sejam criados getters e setters, do contrário não há lógica em se criar uma Entidade.

Para tal, vamos utilizar a linha de comando:

php app/console generate:doctrine:entities AcmeDemoBundle:Product

NOTA: Preste atenção que usamos “entities” e não “entity“. Desta forma, o arquivo original será mantido e somente serão adicionados os setters e getters.

...
    /**
     * Set name
     *
     * @param string $name
     * @return Product
     */
    public function setName($name)
    {
        $this->name = $name;
    
        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Product
     */
    public function setDescription($description)
    {
        $this->description = $description;
    
        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set price
     *
     * @param float $price
     * @return Product
     */
    public function setPrice($price)
    {
        $this->price = $price;
    
        return $this;
    }

    /**
     * Get price
     *
     * @return float 
     */
    public function getPrice()
    {
        return $this->price;
    }

    /**
     * Set status
     *
     * @param boolean $status
     * @return Product
     */
    public function setStatus($status)
    {
        $this->status = $status;
    
        return $this;
    }

    /**
     * Get status
     *
     * @return boolean 
     */
    public function getStatus()
    {
        return $this->status;
    }

...

NOTA: Sempre utilize:

php app/console generate:doctrine:entities NameSpaceHere:EntityName

para atualizar uma entidade no doctrine.

E:

php app/console generate:doctrine:entities NameSpaceHere

para atualizar todas as entidades.

É isso ai! Abração do Giba.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *