У меня проблема с чем-то, что, на мой взгляд, является довольно простой, но причина ускользает от меня.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
));
}
}
Во-первых, почему вы используете DataTransformer в этом поле объекта? Symfony способен преобразовать целое число (предоставленное полем выбора формы) в объект, если вы предоставляете класс, который вы использовали в параметрах поля. Во-вторых, можете ли вы предоставить исключение? – VaN
@VaN Привет, у меня был трансформатор, чтобы убедиться, что он конвертирует. Это не нужно, и я удалил его с тех пор. Я опубликовал свое сообщение, чтобы показать фактическое исключение. Спасибо за вашу помощь, этот меня заводит! –
Единственное, с чем я не знаком, это ваш способ справиться с подачей формы. Я никогда не использовал '$ 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