2014-02-02 3 views
1

У меня есть форма UserType, связанная с объектом Пользователь. Эта форма вызывает другую форму: CityTypeВстраиваемые формы Symfony2 и дубликаты баз данных

<?php 

namespace ...\SiteBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class UserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('city', new CityType(), array('label' => false)) 
       ->add(...); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'FindBack\SiteBundle\Entity\User', 
      'cascade_validation' => true 
     )); 
    } 
    // ... 
} 

Пользователь зависимая таблица выглядит следующим образом:

id | city_id | ... 
---|---------|----- 
1 | 1  | ... 
2 | 1  | ... 
3 | 2  | ... 

Вот CityType:

<?php 

namespace FindBack\SiteBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class CityType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name', 'text'); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'FindBack\SiteBundle\Entity\City', 
     )); 
    } 

    public function getName() 
    { 
     return 'city'; 
    } 
} 

Так что, когда я создаю Пользователь до Тип пользователя Форма, новый Город. Если я создаю пользователя дважды имя же города (то есть: Марсель), моя база данных будет выглядеть:

id name 
--|---------- 
1 | Marseille 
2 | Marseille 
3 | Paris 
... 

Так что есть дубликат, и я хочу, чтобы избежать этого! Как я могу продолжить? Я попытался установить ограничение уникальности для имени поля таблицы City, но когда я хочу, чтобы создать еще один пользователя, «SQLSTATE [23000]: Integrity нарушение ограничения: 1062 записи Дублированного„Марселя“для ключа «имя» выбрасывается Symfony2. кажется, логика.

ли у меня проверить в контроллера, связанного с пользователя, если уже есть город, названный «Марсель» в базе данных, а затем доцентом существительное Город to my Пользователь?

+0

Почему бы вам не предложить решение, в котором города уже вставлены база данных? – DonCallisto

+0

@DonCallisto Я не уверен, чтобы понять, что вы имеете в виду ... Я не собираюсь заполнять мою базу данных всеми городами из Франции! – peltho

+0

Итак, если я собираюсь заполнить ваше поле «город: лунная ракета», вы примете его? – DonCallisto

ответ

0

Прежде всего, вам нужно:

  • контроллер, где вы будете размещать свои формы
  • хранилище для вашего города объекта

Это всего лишь пример, как я не ничего не знают о вашей заявке:

use Symfony\Component\HttpFoundation\Request; 

public function registerUserAction(Request $request) { 
    [...] 
    $cr = $this->getDoctrine()->getManager()->getRepository('CityRepository'); 
    [...] 
    $user = new User(); 
    $form = $this->createForm(new $form(...), $user); 
    $form->bind($request); 
    //get the field from form 
    $cn = $request->get('city_name'); 
    //search for a pre existent entity 
    $city = $cn->findOneByCityName($cn); 
    if($city) { 
    $user->setCity($city); 
    } 
    if($form->isValid()){ 
    [...] 
    } 
} 
+0

Кажется, это обходной путь, я очень удивлен, что Symfony2 не предоставляет другого способа сделать это. Более того, если я хочу проверить имя и двенадцать других полей, нужно ли мне повторить процесс для всех тезисов? – peltho

+0

@peltho: вы можете определить собственное ограничение на поля формы и позволить symfony2 проверить их для вас (с помощью метода '-> isValid()'). Но этот конкретный случай отличается, поскольку вы не только проверите, но и сделаете некоторые другие действия после этой проверки ... – DonCallisto

Смежные вопросы