2015-02-20 2 views
0

Мне нужно объединить таблицы «fos_user» и «институт». И мне нужно отобразить регистрационную форму для обоих объектов. У меня проблема с FOSUserBundle. Я создал новые свойства в классе UserКак интегрировать формы нескольких объектов? Symfony 2

/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

protected $workPhone; 

protected $adminPhone; 

protected $name; 

protected $adress; 

public function __construct() 
{ 
    parent::__construct(); 
} 

public function setAdress($adress) 
{ 
    $this->adress = $adress; 
} 

public function setName($name) 
{ 
    $this->name = $name; 
} 

public function setWorkPhone($workPhone) 
{ 
    $this->workPhone = $workPhone; 
} 

public function setAdminPhone($adminPhone) 
{ 
    $this->adminPhone = $adminPhone; 
} 

public function getName() 
{ 
    return $this->name; 
} 

public function getAdress() 
{ 
    return $this->adress; 
} 

public function getWorkPhone() 
{ 
    return $this->workPhone; 
} 

public function getAdminPhone() 
{ 
    return $this->adminPhone; 
} 

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

И у меня есть сущности институт, который я хочу объединить.

/** 
* @var integer 
* 
* @ORM\Column(name="id_institution", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
private $idInstitution; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=45, nullable=false) 
*/ 
private $name; 

/** 
* @var integer 
* 
* @ORM\Column(name="work_phone", type="integer", nullable=false) 
*/ 
private $workPhone; 

/** 
* @var integer 
* 
* @ORM\Column(name="admin_phone", type="integer", nullable=true) 
*/ 
private $adminPhone; 

/** 
* @var string 
* 
* @ORM\Column(name="adress", type="string", length=255, nullable=false) 
*/ 
private $adress; 

/** 
* @var \AppBundle\Entity\FosUser 
* 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\FosUser") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="id_fos_user", referencedColumnName="id") 
* }) 
*/ 
private $idFosUser; 

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

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

    return $this; 
} 

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

/** 
* Set workPhone 
* 
* @param integer $workPhone 
* @return Institution 
*/ 
public function setWorkPhone($workPhone) 
{ 
    $this->workPhone = $workPhone; 

    return $this; 
} 

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

/** 
* Set adminPhone 
* 
* @param integer $adminPhone 
* @return Institution 
*/ 
public function setAdminPhone($adminPhone) 
{ 
    $this->adminPhone = $adminPhone; 

    return $this; 
} 

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

/** 
* Set adress 
* 
* @param string $adress 
* @return Institution 
*/ 
public function setAdress($adress) 
{ 
    $this->adress = $adress; 

    return $this; 
} 

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

/** 
* Set idFosUser 
* 
* @param \AppBundle\Entity\FosUser $idFosUser 
* @return Institution 
*/ 
public function setIdFosUser($idFosUser = null) 
{ 
    $this->idFosUser = $idFosUser; 

    return $this; 
} 

/** 
* Get idFosUser 
* 
* @return \AppBundle\Entity\FosUser 
*/ 
public function getIdFosUser() 
{ 
    return $this->idFosUser; 
} 

Это дерзкий из InstitutionManager, где я хочу сохранить Entity, и это похоже на обслуживание в настоящее время:

public function createNewEntity($user) 
{ 
    $entity = new Institution(); 
    $entity->setName($user->getName()); 
    $entity->setAdminPhone($user->getAdminPhone()); 
    $entity->setWorkPhone($user->getWorkPhone()); 
    $entity->setAdress($user->getAdress()); 
    $entity->setidFosUser($user->getId()); 

    $em = $this->getDoctrine()->getManager(); 
    $em->persist($entity); 
    $em->flush(); 

} 

И услышать переопределение RegistrationController:

public function registerAction() 
{ 
    $form = $this->container->get('fos_user.registration.form'); 
    $formHandler = $this->container->get('fos_user.registration.form.handler'); 
    $confirmationEnabled = $this->container->getParameter('fos_user.registration.confirmation.enabled'); 

    $process = $formHandler->process($confirmationEnabled); 
    if ($process) { 
     $user = $form->getData(); 

     $authUser = false; 
     if ($confirmationEnabled) { 
      $this->container->get('session')->set('fos_user_send_confirmation_email/email', $user->getEmail()); 
      $route = 'fos_user_registration_check_email'; 
     } else { 
      $authUser = true; 
      $route = 'fos_user_registration_confirmed'; 
     } 

     $this->setFlash('fos_user_success', 'registration.flash.user_created'); 


     $institutionManager = $this->container->get('institution_manager'); 
     $institution = $institutionManager->createNewEntity($user); 

     $url = $this->container->get('router')->generate($route); 
     $response = new RedirectResponse($url); 

     if ($authUser) { 
      $this->authenticateUser($user, $response); 
     } 

     return $response; 
    } 

    return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.'.$this->getEngine(), array(
     'form' => $form->createView(), 
    )); 
} 

services.yml:

services: 
    institution_manager: 
     class: AppBundle\Lib\Manager\InstitutionManager 
     arguments: [ @doctrine.orm.default_entity_manager ] 
+0

Отправьте свой контрольный код пожалуйста – DonCallisto

+0

Я обновляю сообщение. Если что-то еще - просто скажите мне! TX – Bender21

+0

@Cerad Спасибо U очень матч! это работает! – Bender21

ответ

2

Ваш InstitutationController неправильно инициализирован. Существует метод setContainer, к которому обращается маршрутизатор, ну, установите контейнер. getDoctrine, в свою очередь, нуждается в контейнере, следовательно, ошибка нулевого объекта.

Простой хак будет вызывать метод setContainer себя:

$entity = new InstitutionController(); 
$entity->setContainer($this->container); 
$entity->createNewEntity($user); 

Но это хак вы должны сделать некоторое перепроектирование. То, что вы называете контроллером, вовсе не является контроллером. Это услуга, может быть, своего рода фабрика или менеджер. Похоже на FOS UserManager.

Так почитайте о том, как определить службу: http://symfony.com/doc/current/book/service_container.html

Это занимает немного исследований, но как только вы поймете процесс, то услуги станут второй натурой. Вы будете вводить администратор сущности доктрины непосредственно в вашу службу.

class InstitutionManager 
{ 
protected $entityManager; 

public function __construct($entityManager) 
{ 
    $this->entityManager = $entityManager; 
} 
public function createNewEntity($user) 
{ 
    $entity = new Institution(); 
    $entity->setName($user->getName()); 
    $entity->setAdminPhone($user->getAdminPhone()); 
    $entity->setWorkPhone($user->getWorkPhone()); 
    $entity->setAdress($user->getAdress()); 
    $entity->setidFosUser($user->getId()); 

    $this->entityManager->persist($entity); 
    $this->entityManager->flush(); 

    return $entity; 
} 

Я оставлю services.yml до вас. Служба идентификатор менеджера является организация doctrine.orm.default_entity_manager

Ваш контроллер будет выглядеть:

$institutionManager = $this->get('institution_manager'); 
$institution = $institutionManager->create($user); 

Вы также хотите, чтобы переосмыслить то, как вы связывающее объект пользователя. Свойство userId - нет. Вы захотите установить взаимно однозначное соотношение между $ instit и $ user. Но это действительно другая тема.

Наслаждайтесь.

+0

Я сделал все, как вы сказали, но теперь у меня есть ошибка _Call для функции-члена persist() для string_ в функции createNewEntity(). '$ this-> entityManager-> persist ($ entity);' – Bender21

+0

Я угадываю, что вы забыли символ @ при вводе службы диспетчера сущностей: '@ doctrine.orm.default_entity_manager'. Если нет, то обновите свой вопрос с помощью определения services.yml. – Cerad

+0

Итак, это не работает. – Bender21

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