Symfony Doctrine YML

Автор: Aport Четверг, Январь 29th, 2015 Нет комментариев

Рубрика: Разное

Начал изучать Doctrine и в документации описывается пример работы на основе PHP-класса, но так же говорится, что таблицу можно описывать в YML-файле. Лично для меня это намного приятный для чтения формат представления данных, и тут есть свои нюансы, о которых ниже.

И так поехали, будем эксперементировать на примере созданного ранее бандла HelloBundle

Создание сущностного класса

1. создаем файл называемый “сущность”, что значит базовый класс, содержащий данные:

/Symfony/src/Acme/HelloBundle/Entity/Product.php

<?php
namespace Acme\HelloBundle\Entity;
class Product
{
}

если забыть создать этот файл, то в пункте 4 мы получим ошибку:

[RuntimeException]
Unable to determine where to save the «Acme\HelloBundle\Entity\Product» class (use the —path option).

2. создаем YAML определения метаданных в файле /Symfony/src/Acme/HelloBundle/Resources/config/doctrine/Product.orm.yml

Acme\HelloBundle\Entity\Product:
    type: entity
    table: bookmarks
    id:
        id:
            type: integer
            generator: { strategy: AUTO }
    fields:
        name:
            type: string
            length: 100
        uri:
            type: text
        dateAdded:
            type: integer

отлично, наша таблица описана, однако в документации, чтобы не усложнять, опущен момент комментирования полей и самой таблицы, поэтому такой пример я решил привести ниже:

Entity\Example:
  type: entity
  table: example
  fields:
    id:
      type: integer
      id: true
      generator:
        strategy: AUTO
    label:
      type: string
      columnDefinition: varchar(255) NOT NULL DEFAULT ‘default_value’ COMMENT ‘This is column comment’

или еще более простой вариант:

MyModel:
  columns:
   count:
    type:     integer
    comment:  ’Column comments accept a maximun of 255 characters.\nThey can also include newline characters (\\n) each one of which counting as one characters.\nThis way you can easily explain each column to database administrators that do not know about your application.’
  options:
    comment:  ’Table comments can be 60 characters long but no line breaks!’

этот вариант сгенерирует следующий SQL-запрос:

CREATE TABLE my_model (
id BIGINT AUTO_INCREMENT,
count BIGINT COMMENT ‘Column comments accept a maximun of 255 characters.\nThey can also include newline characters (\\n) each one of which counting as one characters.\nThis way you can easily explain each column to database administrators that do not know about your application.’,
PRIMARY KEY(id)
)
COMMENT = ‘Table comments can be 60 characters long but no line breaks!’
ENGINE = INNODB;

Создание геттеров и сеттеров

1. чистим кэш, как это сделать я писал ранее »

2. в консоле выполняем команду

php app/console doctrine:generate:entities Acme/HelloBundle/Entity/Product

3. смотрим в /Symfony/src/Acme/HelloBundle/Entity/Product.php и видим, что в файл прописались все гетеры и сетеры, которые мы объявили в YAML-файле.

*обратите внимание, рядом появился файл Product.php~ это тот код, который был до выполнения команды (предыдущая версия файла).

Создание таблиц/схемы для базы данных

php app/console doctrine:schema:update —force

ну а дальше все как в документации.

Отказываемся от YAML

Как показывает опыт дальнейшей разработки, использование YAML оказывается не очень удобным т.к. при изменении, добавлении или удаления поля, приходится вносить изменения не только в YAML-файл, но и в файл сущности /Symfony/src/Acme/HelloBundle/Entity/Product.php

Создаем уникальный индекс

Все бы хорошо, но пришлось столкнуться с проблемой добавления индекса, на всех сайтах что я успел нагуглить пишут, что делается это с помощью добавления следующей строчки в описание таблицы:

<?php
namespace Acme\HelloBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name=»bookmarks», uniqueConstraints={@UniqueConstraint(name=»uri_md5″,columns={«uri_md5″})})
*/
class Product
{

как видно из примера мы делаем поле uri_md5 уникальным индексом который назовем одноименно uri_md5

но, если Вы решите синхронизировать Вашу сущность с таблицей, с помощью команды:

php app/console doctrine:schema:update —force

то получите ошибку:

[Doctrine\Common\Annotations\AnnotationException]
[Semantical Error] The annotation «@UniqueConstraint» in class Acme\HelloBundle\Entity\Product was never imported. Did you maybe forget to add a «use» statement for this annotation?

и правильно, потому что нужно было написать так:

<?php
namespace Acme\HelloBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name=»bookmarks», uniqueConstraints={@ORM\UniqueConstraint(name=»uri_md5″,columns={«uri_md5″})})
*/
class Product
{

Создание геттеров и сеттеров

При этом, генерацию гетеров и сетеров можно выполнить командой:

$ app/console doctrine:generate:entities AcmeHelloBundle:Product

надеюсь, Вы пополнили свой багаж знаний и готовы к изучению нового, всем удачки!

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты