воскресенье, 31 октября 2010 г.

Часть первая. Doctrine2 (entity) в Symfony 2.

В этой статье пойдёт речь о использовании Doctrine2 в Symfony2. За основу будет взят пример из моих предыдущих статей про формы в Symfony2.
Итак в этой статье мы рассмотрим как создаются Entity, создадим entity User, сгенерируем таблицу user и класс отвечающий за Entity. Во второй части мы научимся сохранять данные.



Для начала нам необходимо настроить наше приложение так, чтобы оно работало с Doctrine2. Для этого зайдём к конфигурационный файл. И добавим следующие строки

$container->loadFromExtension('doctrine', 'dbal', array(
    'dbname'   => 'your-database-name',
    'user'     => 'user',
    'password' => 'password',
));

$container->loadFromExtension('doctrine', 'orm', array());
После этого переходим в корень проекта, затем в консоли выполняем следующую команду
php ./app/console doctrine:database:create
У вас должно вывестись сообщение, о том, что база данных была создана.
Первую часть работы мы уже сделали. Теперь давайте займёмся созданием Entity. Переместимся в папку с нашим бандлом (Application/HelloBundle). Создадим тут папку Entity, сюда будут склыдваться сгенерированные доктриной классы сущностей (entity).

Все entity которые относятся к бандлу должны храниться в папке Resources/config/doctrine/metadata/orm. Это очень важно! Шаблон который вы должны использовать для создания файла entity должен выглядеть следующим образом -

путь_к_папке_с_сбандлом.имя_бандла.Entity.имя_entity.dcm.расширение_файла

Наш файл должен называться следующим образом - Application.HelloBundle.Entity.User.dcm.xml

Вспомним, что наш пользователь имеет имя и фамилию. Давайте добавим следующий код, в файл нашей сущности

<?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="Application\HelloBundle\Entity\User" table="user">
     <id name="id" type="integer" column="id">
  <generator strategy="AUTO" />
     </id>
     <field name="name" type="string" length="50" unique="true" />
     <field name="surname" type="string" length="50" />
 </entity>
</doctrine-mapping>
Разберём вышеприведённую xml по строкам.
<entity name="Application\HelloBundle\Entity\User" table="user">
Тут мы объявлем, что это entity и в качестве атрибутов добавляем name - содержит путь по которому она будет доступна - Application\HelloBundle\Entity\User (в папку Entity будет сгенерирован файл User.php). Второй параметр table говорит сам за себя, т.е. в базе данных будет создана таблица с именем user.
Между тегами entity содержатся поля нашеё таблицы.
<id name="id" type="integer" column="id">
     <generator strategy="AUTO" />
</id>
Поле Id - идентификатор.
name - как будет именоваться поле (свойство) в классе вашей Entity.
column - как будет именоваться поле в таблице. (если его не указывать, то оно будет таким же как и атрибут name)
type - тут я думю, что понтяо. Тип поля (integer, string etc. )
Следующее и последнее поле name
<field name="name" type="string" length="50" unique="true" />
В тегах field вы описывает остальные поля которые должны присутсвовать в вашей таблице. По скольку выше мы уже рассмотрели аттрибуты name, column, type, давайте рассмотрим те которых мы не коснулись.
unique - принимает занчения false, true. Определяет будет ли поле уникалным в вашей таблице. Поле не обязательное.
length-применим к строкам. Определяет длину строки.
После того как мы создали xml файл для нашей entity User перейдем в консоль и сгенерируем таблицу, и файл для нашей Entity.
php ./app/console doctrine:generate:entities
Если есть необходимость сгенерировать entity только для конкретного бандла, то необходимо выполнить следующую команду
php ./app/console doctrine:generate:entities  --bundle="Application/HelloBundle"
Если определённую entity в бандле то
php ./app/console doctrine:generate:entities  --bundle="Application/HelloBundle" --entity="User"
Итак, после генериции entity у нас в папке Application/HelloBundle/Entity должен находиться файл User.php.
Теперь давайте создадим таблицу в нашей базе данных. Сделаем мы это просто выполнив команду
php ./app/console doctrine:schema:create
На этом всё, во второй части как я и общещал, мы задействуем нашу Entity и сохраним данные в нашу талицу.

P.S.
Просмотреть доступные команды вы можете с помощью команды
php ./app/console
Доступные типы данных в Doctrine2 вы можете посмотреть тут
Как создавать entity с помощью xml разметки тут

2 комментария:

  1. автор ты какой-то велосипедист
    все это можно сделать одной командой
    app/console doctrine:generate:entity "MyCustomBundle" "User\Group" --fields
    ="name:string(255) description:text"

    ОтветитьУдалить
  2. Причем тут велосипед?:) Я придумал что-то новое или переделал/дописал свое - не доктриновское?

    ОтветитьУдалить