2016-08-31 3 views
0

У меня проблема с чем-то, что, на мой взгляд, является довольно простой, но причина ускользает от меня.Symfony Form with Doctrine Entity - Связь не загружается для редактирования

У меня есть два объекта, организация и подписка. Организация связана с одной подпиской.

Я хочу, чтобы иметь возможность редактировать это через форму (создание через форму уже работает). Когда я делаю следующее:

$organisation = $this->getDoctrine()->getRepository('AppBundle\Entity\Organisation') 
     ->findOneBy(array(
      'id' => $id 
     )); 

    $form = $this->createForm(new OrganisationType(), $organisation, array(
     'method' => 'POST' 
    )); 

    $form->submit($paramFetcher->all()); 

я получаю исключение, так как подписка на имущество организации юридического лица не установлено (несмотря на прохождение, которое имеет подписку в виде значения по умолчанию). Исключение состоит в следующем:

Expected argument of type "AppBundle\Entity\Subscription", "NULL" given 

Это, очевидно, быть брошенный методом setSubscription на лице Организации, но я не знаю, почему, как форма должна быть преобразованием INT значения, передаваемое в подписке объект автоматически.

Я делаю что-то глупое здесь? Я приложил соответствующий код ниже. Спасибо!

Простейшим действия контроллера, который размножается этому вопросу

public function testAction(Request $request) 
{ 

    $organisation = $this->getDoctrine()->getRepository('AppBundle\Entity\Organisation') 
     ->findOneBy(array('id' => 7)); 

    $form = $this->createForm(new OrganisationType(), $organisation); 

    $form->submit($request->request->all()); 

    return $this->render('test.html.twig', array(
     'testform' => $form->createView() 
    )); 

} 

Organisation.php

<?php 

namespace AppBundle\Entity; 

use Doctrine\Common\Collections\Collection; 
use Doctrine\ORM\Mapping as ORM; 
use JMS\Serializer\Annotation as JMS; 
use Gedmo\Mapping\Annotation as Gedmo; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* Organisation 
* 
* @ORM\Table(name="organisation") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\OrganisationRepository") 
*/ 
class Organisation 
{ 

const ENABLED = 1; 
const DISABLED = 2; 

/** 
* @var int 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* @JMS\Groups({"default", "list-organisation"}) 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255) 
* @JMS\Groups({"default", "list-organisation"}) 
*/ 
private $name; 

/** 
* @var Subscription|null The subscription this organisation is currently linked to 
* @ORM\ManyToOne(targetEntity="Subscription", inversedBy="organisations") 
* @ORM\JoinColumn(name="subscription_id", referencedColumnName="id", onDelete="set null") 
* @JMS\Groups({"default", "list-organisation"}) 
*/ 
private $subscription; 

/** 
* @var Collection 
* @ORM\OneToMany(targetEntity="User", mappedBy="organisation") 
* @JMS\Groups({}) 
*/ 
private $users; 

/** 
* @var Collection 
* @ORM\OneToMany(targetEntity="Subgroup", mappedBy="organisation") 
* @JMS\Groups({"default"}) 
*/ 
private $subgroups; 

/** 
* @var string $enabled 
* 
* @ORM\Column(type="string") 
*/ 
private $enabled = self::ENABLED; 

/** 
* @var datetime $created 
* 
* @Gedmo\Timestampable(on="create") 
* @ORM\Column(type="datetime") 
* @JMS\Groups({"default", "list-organisation"}) 
*/ 
private $created; 

/** 
* @var datetime $updated 
* 
* @Gedmo\Timestampable(on="update") 
* @ORM\Column(type="datetime") 
* @JMS\Groups({"default", "list-organisation"}) 
*/ 
private $updated; 

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

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

    return $this; 
} 

/** 
* Sets subscription 
* 
* @param Subscription $subscription 
* @return $this 
*/ 
public function setSubscription(Subscription $subscription) 
{ 
    $this->subscription = $subscription; 

    return $this; 
} 

/** 
* Gets subscription 
* 
* @return Subscription|null 
*/ 
public function getSubscription() 
{ 
    return $this->subscription; 
} 

/** 
* Sets enabled 
* 
* @param $enabled 
*/ 
public function setEnabled($enabled) 
{ 
    if (!in_array($enabled, array(self::ENABLED, self::DISABLED))) { 
     throw new \InvalidArgumentException('Invalid enabled status'); 
    } 

    $this->enabled = $enabled; 
} 

/** 
* Gets enabled 
* 
* @return string 
*/ 
public function getEnabled() 
{ 
    return $this->enabled; 
} 

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

/** 
* Returns Users belonging to this organisation 
* 
* @return Collection 
*/ 
public function getUsers() 
{ 
    return $this->users; 
} 

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

Subscription.php

<?php 

namespace AppBundle\Entity; 

use Doctrine\Common\Collections\Collection; 
use Doctrine\ORM\Mapping as ORM; 
use JMS\Serializer\Annotation as JMS; 
use Gedmo\Mapping\Annotation as Gedmo; 

/** 
* Organisation 
* 
* @ORM\Table(name="subscription") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\SubscriptionRepository") 
*/ 
class Subscription 
{ 
/** 
* @var int 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* @JMS\Groups({"default", "list-organisation"}) 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255) 
* @JMS\Groups({"default", "list-organisation"}) 
*/ 
private $name; 

/** 
* @var Collection 
* @ORM\OneToMany(targetEntity="Organisation", mappedBy="subscription") 
* @JMS\Groups({"default"}) 
*/ 
private $organisations; 

/** 
* @var datetime $created 
* 
* @Gedmo\Timestampable(on="create") 
* @ORM\Column(type="datetime") 
* @JMS\Groups({"default"}) 
*/ 
private $created; 

/** 
* @var datetime $updated 
* 
* @Gedmo\Timestampable(on="update") 
* @ORM\Column(type="datetime") 
* @JMS\Groups({"default"}) 
*/ 
private $updated; 

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

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

    return $this; 
} 

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

/** 
* Returns Organisations with this subscription type 
* 
* @return Collection 
*/ 
public function getOrganisations() 
{ 
    return $this->organisations; 
} 

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

OrganisationType.php

<?php 

namespace AppBundle\Form; 

use Doctrine\Common\Persistence\ObjectManager; 
use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class OrganisationType extends AbstractType 
{ 
private $manager; 

public function __construct(ObjectManager $objectManager) 
{ 
    $this->manager = $objectManager; 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('name'); 
    $builder->add('subscription', EntityType::class, array(
     'class' => 'AppBundle\Entity\Subscription' 
    )); 

} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'AppBundle\Entity\Organisation', 
     'csrf_protection' => false 
    )); 
} 
} 
+1

Во-первых, почему вы используете DataTransformer в этом поле объекта? Symfony способен преобразовать целое число (предоставленное полем выбора формы) в объект, если вы предоставляете класс, который вы использовали в параметрах поля. Во-вторых, можете ли вы предоставить исключение? – VaN

+0

@VaN Привет, у меня был трансформатор, чтобы убедиться, что он конвертирует. Это не нужно, и я удалил его с тех пор. Я опубликовал свое сообщение, чтобы показать фактическое исключение. Спасибо за вашу помощь, этот меня заводит! –

+0

Единственное, с чем я не знаком, это ваш способ справиться с подачей формы. Я никогда не использовал '$ form-> submit ($ paramFetcher-> all())'. Согласно документации, способ обработки формы - это следующее: '$ form-> handleRequest ($ request); if ($ form-> isSubmitted() && $ form-> isValid()) { $ organization = $ form-> getData(); // ... выполнять некоторые действия, такие как сохранение задачи в базе данных. см. Http://symfony.com/doc/current/forms.html#handling-form-submissions – VaN

ответ

0

На свежем Symfony 3.1, это работает как шарм (и это рекомендуемый способ обработки формы представления, как указано в предыдущем комментарии):

public function testAction(Request $request) 
{ 
    $organisation = $this->getDoctrine()->getRepository('AppBundle\Entity\Organisation') 
     ->find(1); 

    $form = $this->createForm(OrganisationType::class, $organisation); 

    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 
     $this->getDoctrine()->getManager()->persist($organisation); 
     $this->getDoctrine()->getManager()->flush(); 

     die('saved into database.'); 
    } 

    return $this->render('test.html.twig', array(
     'testform' => $form->createView() 
    )); 

} 
+0

Большое спасибо за усилия. Я не нашел источник этого, хотя я подозреваю, что это может быть связано с группами сериализации или чем-то еще. Я должен был двигаться дальше, но я обновлю вопрос с ответом, когда вернусь к нему. –

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

  • Нет связанных вопросов^_^