web-dev-qa-db-fra.com

Comment créer une entité avec Symfony2

Ma question générale est de savoir comment créer des entités et des référentiels avec symfony2.

  • Comment créer une entité/un référentiel avec un schéma.yml avec doctrine orm? Où dois-je sauvegarder le fichier schema.yml? Quelles sont les commandes à saisir dans la console?
  • Je crée une entité de classe sans schema.yml que faire après? Commander!?
  • Où dois-je sauvegarder mon fichier d'entité/référentiel quand l'entité est générale pour tout le projet ou spécifique à un ensemble?
15
acubens

Mes solutions (je ne sais pas si c'est bon, meilleure pratique!?)

YML

Créez le fichier " Entities.User.dcm.yml " dans HelloBundle/Resources/config/doctrine/metadata/orm avec ce code (par exemple):

Entities\User:
  type: entity
  table: users
  id:
    id:
      type: integer
      generator:
        strategy: AUTO
  fields:
    name:
      type: string
      length: 50

Alors

php app/console doctrine:mapping:import "HelloBundle" yml

php app/console doctrine:generate:entities "HelloBundle"

Ensuite, vous pouvez le tester dans votre contrôleur avec:

$user = new \Sensio\HelloBundle\Entity\User;
$user->setName('Acubens');
$em = $this->get('doctrine.orm.entity_manager');
$em->persist($user);
$em->flush();

ou avecPHP

Créez le fichier "User.php" dans HelloBundle\Entity avec ce code

// Sensio/HelloBundle/Entity/User.php
namespace Sensio\HelloBundle\Entity;

/**
 * @orm:Entity
 */
class User
{
    /**
     * @orm:Id
     * @orm:Column(type="integer")
     * @orm:GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @orm:Column(type="string", length="255")
     */
    protected $name;
}

Alors

php app/console doctrine:mapping:import "HelloBundle"

cela générera dans "HelloBundle/Resources/config/doctrine/metadata/orm"

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="Sensio\HelloBundle\Entity\User" table="user">
    <change-tracking-policy>DEFERRED_IMPLICIT</change-tracking-policy>
    <id name="id" type="integer" column="id">
      <generator strategy="IDENTITY"/>
    </id>
    <field name="name" type="string" column="name" length="255"/>
    <lifecycle-callbacks/>
  </entity>
</doctrine-mapping>

Then delete User.php

php app/console doctrine:generate:entities "HelloBundle"

Après avoir créé un nouveau fichier Nice, User.php

<?php

namespace Sensio\HelloBundle\Entity;

/**
 * Sensio\HelloBundle\Entity\User
 */
class User
{
    /**
     * @var string $name
     */
    private $name;

    /**
     * @var integer $id
     */
    private $id;


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

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

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

Et vous comment allez-vous? Pourquoi dois-je spécifier HelloBundle dans mes commandes?

ps : mon fichier config.yml

doctrine.dbal:
    driver:   pdo_mysql
    dbname:   sf2
    user:     root
    password: 
    logging:  %kernel.debug%
doctrine.orm:
    auto_generate_proxy_classes: %kernel.debug%
    mappings:
        HelloBundle: ~
15
acubens

Si vous utilisez une annotation YML pour générer votre schéma, vous pouvez avoir ceci:

Namespace\NameBundle\Entity\Build:
  type: entity
  repositoryClass: Namespace\NameBundle\Entity\Repository\BuildRepository
  ...

lors de l'utilisation de la ligne de commande app/console doctrine: generate: entités NamespaceNameBundle Ceci générerait automatiquement votre entité et votre classe de référentiel

2
wenders

http://docs.symfony-reloaded.org/guides/doctrine/orm/index.html

Cette section devrait contenir toutes les informations dont vous avez besoin.

Bien que Symfony2 soit actuellement en phase de stabilisation, la dernière version de PR6 ne contient toujours pas beaucoup de fonctionnalités et la situation devrait changer avec la version RC1. N'ayez pas peur de plonger dans le code et de comprendre vous-même les choses.

1
Hakan Deryal

Je cherchais une solution utilisant la cartographie YML, car elle ne figure nulle part dans le livre. Après avoir chuté un peu, j'ai constaté que vos mappages devraient suivre ces règles:

  • le fichier doit être placé dans src/YourAppName/YourBundleName/Resources/config/doctrine/EntityName.orm.yml
  • le nom de la classe d'entité doit être plein (par exemple: YourAppName\YourBundleName\Entity\EntityName

J'espère que ça aide.

1
Nikola Petkanski

Je pense que vous devez choisir entre la création de classe ou la configuration yml. Si vous créez une classe d'entité et le fichier config yml, puis exécutez doctrine: generate: entités Vous avez une erreur. Je vous recommande à vous de coller avec le style de classe avec des annotations, puis utilisez $ php application/console doctrine: base de données: créer $ php application/console doctrine: schema: créer

0
dxb