Как создать объект с Symfony2

Мой общий вопрос: как создавать объекты и репозитории с помощью symfony2?

  • Как создать объект/репозиторий с помощью schema.yml с доктриной? Где я должен сохранить файл schema.yml? Какие команды вводить в консоли?
  • Я создаю сущность класса без schema.yml, что делать дальше? Команда!?
  • Где я должен сохранить свой файл сущности/репозитория, если сущность является общей для всего проекта или специфичной для пакета?

person acubens    schedule 13.02.2011    source источник
comment
Если вы хотите продолжить работу с Symfony2, документации на docs.symfony-reloaded.org должно быть достаточно. для начала работы, включая сохранение объектов в базе данных и структуре папок. Если у вас возникли проблемы с этим, то ответ Дэна - путь вперед. Проверено и проверено :-)   -  person richsage    schedule 13.02.2011
comment
Спасибо за ваши комментарии! Я использую symfony1.4 все дни... Я просто хочу попробовать и понять эту новую версию (стабильная версия будет очень скоро), но я нахожу переход на sf2 немного дестабилизирующим. Я уверен, что я не единственный! продолжаю тесты...   -  person acubens    schedule 14.02.2011
comment
@acubens Symfony2 сам по себе не является обновлением для Symfony 1.x — он был полностью переписан с нуля, и пути обновления не будет. Поэтому, если вы все еще думаете о переходе, имейте в виду, что это совершенно другой фреймворк, и большая часть того, что вы сделали в sf1.4 и т. д., не будет таким же в Symfony2.   -  person richsage    schedule 21.02.2011
comment
Я знаю, что в symfony2 появилось много нового. Я не хочу переносить свой старый проект sf1 в Sf2... Я просто хочу понять, почему команда php app/console doctrine:generate:entities не работает (я создаю класс в папке Entitiy, активные сопоставления в конфигурации .yml)? Я не нашел хорошей документации о сущностях/репозиториях/прокси. Спасибо.   -  person acubens    schedule 22.02.2011
comment
Хорошо для вас, если вы попадаете выше головы. На мой взгляд, это лучший способ учиться. Я буду очень признателен за вопросы и ответы по symfony2 на SO, поскольку сам погружаюсь в symfony2.   -  person Banjer    schedule 24.03.2011
comment
Перестаньте использовать генерацию сущностей по умолчанию для разработки своих проектов. Хотя это распространенная привычка, генерация классов не даст вам ни лучшей реализации, ни самой безопасной: ваша IDE может генерировать геттеры/сеттеры намного лучше, чем Doctrine, а Doctrine даже не является инструментом генерации кода. Имейте в виду, что сущности являются частью вашей кодовой базы, их следует тестировать, ассоциации должны быть согласованными, а геттеры/сеттеры должны быть правильно введены. Генераторы — это просто причина многих ошибок, которые я вижу в последнее время, когда люди просят у меня поддержки по поводу Doctrine.   -  person Ocramius    schedule 21.01.2013
comment
Я предложил это для закрытия как слишком широкое. Сейчас, когда Symfony 2 созрела, это не очень полезный вопрос. Существует отличная документация здесь об этой части symfony.   -  person rjmunro    schedule 03.06.2014
comment
да и сейчас не пригодится. Удалите это!   -  person acubens    schedule 05.06.2014


Ответы (5)


Мои решения (я не знаю, хорошо ли это, лучшая практика!?)

YML

Создайте файл "Entities.User.dcm.yml" в HelloBundle/Resources/config/doctrine/metadata/orm с помощью этого кода (на примере):

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

Затем

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

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

Затем вы можете протестировать его в своем контроллере с помощью:

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

или с помощью PHP

Создайте файл «User.php» в HelloBundle\Entity с этим кодом

// 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;
}

Затем

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

это будет создано в "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>

Затем удалите User.php

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

После того, как у вас есть новый хороший файл 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;
    }
}

А ты как поживаешь? Почему я должен указывать HelloBundle в своих командах?

ps: мой 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: ~
person acubens    schedule 28.02.2011
comment
Для меня это говорит: [InvalidArgumentException] Должен быть определен параметр doctrine.orm.default_entity_manager. - person umpirsky; 08.03.2011
comment
теперь вы также можете поместить все сопоставления в mapping.orm.yml в HelloBundle/Resources/config/doctrine - person jihi; 22.05.2011
comment
Я нашел следующую ссылку полезной: symfony.com/doc/current/cookbook/doctrine / Когда я попытался выполнить шаги, описанные в посте, я столкнулся с несколькими проблемами. - person ealbert; 12.11.2013

Если вы используете аннотацию YML для создания своей схемы, у вас может быть следующее:

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

при использовании приложения/консоли командной строки доктрина: сгенерировать: сущности NamespaceNameBundle Это автоматически сгенерирует вашу сущность и класс репозитория.

person wenders    schedule 03.01.2012

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

В этом разделе должна быть вся необходимая информация.

Хотя Symfony2 сейчас находится на стадии стабилизации, в последней версии PR6 по-прежнему отсутствует множество функций, и, скорее всего, в версии RC1 все изменится. Не бойтесь погрузиться в код и разобраться во всем самостоятельно.

person Hakan Deryal    schedule 25.02.2011

Я искал решение с использованием сопоставления YML, так как его нигде нет в книге. Немного поразмыслив, я обнаружил, что ваши сопоставления должны следовать следующим правилам:

  • файл должен быть помещен в src/YourAppName/YourBundleName/Resources/config/doctrine/EntityName.orm.yml
  • имя класса сущности должно быть полным (например: YourAppName\YourBundleName\Entity\EntityName

Надеюсь, это поможет.

person Nikola Petkanski    schedule 04.11.2011

Я думаю, что вы должны выбрать между созданием класса или конфигурацией yml. Если вы создаете класс сущностей и файл конфигурации yml, а затем выполняете доктрину: сгенерировать: сущности, у вас есть ошибка. Я рекомендую вам придерживаться стиля класса с аннотациями, а затем использовать доктрину $ php app/console:database:create $ php app/console doctrine:schema:create

person dxb    schedule 25.02.2011