Как объединить формы нескольких сущностей? Symfony 2

0

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

/**
 * @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
    Разместите свой код контроллера, пожалуйста
  • 0
    Я обновляю пост. Если что-то еще - просто скажи мне! TX
Показать ещё 1 комментарий
Теги:
fosuserbundle
doctrine2

1 ответ

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

Я останусь с вами. Идентификатор службы менеджера объектов - doctrine.orm.default_entity_manager

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

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

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

Наслаждаться.

  • 0
    Я сделал все, как вы сказали, но теперь у меня есть ошибка Вызов функции-члена persist () для строки в функции createNewEntity (). $this->entityManager->persist($entity);
  • 0
    Я предполагаю, что вы забыли символ @ при добавлении службы менеджера сущностей: '@ doctrine.orm.default_entity_manager'. Если нет, то обновите ваш вопрос определением services.yml.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню