Я использую symfony 2.8 с доктриной (и все еще учусь, как вы увидите).
У меня есть этот контроллер, в котором я создаю некоторую форму и визуализирую ее. Я не понимаю, как symfony может знать тип объекта $contract ниже. Однако эти объекты $contract попадают в мою базу данных в таблице контрактов, поэтому должно быть что-то (магическое?), Я не понимаю, что происходит.
class MyContractsController extends BaseController
{
public function addAction(Request $request)
{
$form = $this->createForm(MultiNewType::class)->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
foreach ($form->getData()['contracts'] as $contract) {
$em->persist($contract);
}
$em->flush();
return $this->validResponse();
}
return $this->renderModalFormResponse($form, array(
'formTemplate' => 'MyBundle:Form:Contract/multiNew.html.twig'
));
}
Ниже файл MultiNewType, в котором я не вижу ничего, связанного с контрактом.
class MultiNewType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('contracts', 'collection', array(
'type' => new NewInlineType(),
'allow_add' => true,
'allow_delete' => true,
'delete_empty' => true,
'label' => false
));
}
public function getName()
{
return 'contractMultiNew';
}
}
И NewInlineType, в котором я вижу все поля таблицы контрактов, но нигде не вижу контракт:
class NewInlineType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('foo', 'bar', array(
'label' => false,
'class' => 'MyBundle:MyClass',
))
->add('format', FormatType::class, array(
'label' => false,
))
->add('version', VersionType::class, array(
'label' => false,
))
->add('debut', 'datePicker', array(
'label' => false,
'placeholder' => 'Début'
))
->add('fin', 'datePicker', array(
'label' => false,
'placeholder' => 'Fin'
));
}
public function getName()
{
return 'contractNew';
}
public function getParent()
{
return 'contractEdit';
}
}
Спасибо
Тип родительской формы (у которого метод getName()
возвращает 'contractEdit'
) должен иметь public function configureOptions()
, который устанавливает значение параметра data_class
по умолчанию, или у него должна быть родительская форма, которая это делает.
Я не уверен, возможно это или нет, но, возможно, data_class настроен в src/AppBundle/Resources/config/services.yml
Вы уверены, что фактический NewInlineType имеет add('foo', 'bar', array( ? Использование bar в качестве типа не имеет смысла. Я предполагаю, что ваш data_class определен в типе 'bar'.
@ArleighHix Я почти уверен, что вы поняли, configureOptions()
настройка класса Contract
находится в классе Contract/EditType.php
!! Большое вам спасибо :) вы хотите опубликовать ответ, чтобы я мог его принять?
Ваш NewInlineType
имеет родительскую форму, как указано в методе getParent()
.
Родительская форма в этом случае вернет 'contractEdit'
из своего getName()
метода.
В родительской (или, возможно, прародительской) форме вы должны найти что-то вроде следующего:
use AppBundle\Entity\Contract;
use Symfony\Component\OptionsResolver\OptionsResolver;
// ...
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Contract::class,
));
}
Это в значительной степени делает то, что он говорит; установка параметра data_class
по умолчанию для имени вашего класса контракта.
это должен быть
MyBundle:MyClass
, но вы должны заменить его на свой Entitys fcn, например `App\Entities\Contract`