Symfony 2.8, 3.0 이상에서 buildForm()에 데이터 전달

응용 프로그램은 현재 이 답변에서 권장하는 대로 생성자를 사용하여 내 양식 유형에 데이터를 전달합니다.그러나 Symfony 2.8 업그레이드 가이드에서는 유형 인스턴스를 에 전달하는 것이 좋습니다.createForm기능은 폐지됩니다.

유형 인스턴스를 Form::add(), FormBuilder::add() 및 FormFactory::create*() 메서드로 전달하는 것은 권장되지 않으며 Symfony 3.0에서는 더 이상 지원되지 않습니다.대신 유형의 정규화된 클래스 이름을 전달하십시오.

Before:
$form = $this->createForm(new MyType());
After: $form = $this->createForm(MyType::class); 

정규화된 클래스명으로 데이터를 전달할 수 없는 것을 알 수 있는데, 대체 방법이 있습니까?



질문에 대한 답변



이것 때문에 우리의 자세도 망가졌다.옵션 해결기를 통해 커스텀 데이터를 전달하여 수정했습니다.

양식 유형:

public function buildForm(FormBuilderInterface $builder, array $options) {
$this->traitChoices = $options['trait_choices'];
$builder
...
->add('figure_type', ChoiceType::class, [
 'choices' => $this->traitChoices,
])
...
; }
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'trait_choices' => null,
]); } 

다음으로 컨트롤러에서 폼을 작성할 때 컨스트럭터가 아닌 옵션으로 폼을 전달합니다.

$form = $this->createForm(ProfileEditType::class, $profile, [
'trait_choices' => $traitChoices, ]); 



다음은 Symfony 3을 사용하는 사용자를 위해 내장된 양식에 데이터를 전달하는 방법입니다.먼저 위의 @sekl에서 설명한 대로 수행한 후 다음을 수행합니다.

프라이머리 폼 타입

entry_options‘를 사용하여 내장된 폼에 var를 전달합니다.

->add('your_embedded_field', CollectionType::class, array(
'entry_type' => YourEntityType::class,
'entry_options' => array(
 'var' => $this->var
))) 

Embedded Form Type에서

옵션을 옵션에 추가합니다해결 프로그램

public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => 'YourbundleEntityYourEntity',
'var' => null
)); } 

buildForm 함수의 변수에 액세스합니다.빌더 함수 전에 이 변수를 설정해야 합니다.내 경우 특정 ID를 기준으로 옵션을 필터링해야 했습니다.

public function buildForm(FormBuilderInterface $builder, array $options) {
$this->var = $options['var'];
$builder
->add('your_field', EntityType::class, array(
'class' => 'YourBundle:YourClass',
'query_builder' => function ($er) {

return $er->createQueryBuilder('u')

->join('u.entity', 'up')

->where('up.id = :var')

->setParameter("var", $this->var);
}))
; } 



여기에는 데이터 검색용 주입 서비스라는 다른 방법을 사용할 수 있습니다.

  1. 서비스로서의 폼 설명(쿡북)
  2. 보호 필드 및 생성자를 양식 클래스에 추가합니다.
  3. 필요한 데이터를 가져오기 위해 주입된 개체 사용

예:

services:
app.any.manager:
class: AppBundleServiceAnyManager
form.my.type:
class: AppBundleFormMyType
arguments: ["@app.any.manager"]
tags: [ name: form.type ] 

<?php
namespace AppBundleForm;
use AppBundleServiceAnyManager; use SymfonyComponentFormAbstractType; use SymfonyComponentFormExtensionCoreTypeChoiceType; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentOptionsResolverOptionsResolver;
class MyType extends AbstractType {
/**
* @var AnyManager
*/
protected $manager;
/**
* MyType constructor.
* @param AnyManager $manager
*/
public function __construct(AnyManager $manager) {
$this->manager = $manager;
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$choices = $this->manager->getSomeData();
$builder
 ->add('type', ChoiceType::class, [

'choices' => $choices
 ])
;
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
 'data_class' => 'AppBundleEntityMyData'
]);
}
} 



form.factory service에서 ‘createNameBuilder’ 또는 ‘createNameed’ 함수를 사용하고 있는 경우 이를 사용하여 데이터를 설정하고 저장하는 방법에 대한 스니펫은 다음과 같습니다.data’ 필드는 사용할 수 없으며(null인 채로) 전달된 데이터/엔티티를 다음과 같이 설정해야 합니다.$options가치.

set Allowed 사용에 대한 @sarahg 명령도 포함했습니다.Types() 및 setRequired() 옵션이 정상적으로 동작하지만 먼저 setDefined()를 사용하여 필드를 정의해야 합니다.

또한 데이터를 설정해야 할 경우 양식 내에서 ‘데이터’ 필드에 데이터를 추가해야 합니다.

컨트롤러에서는 getName이 2.8/3.0에서 폐지되어 getBlockPrefix를 사용하고 있습니다.

컨트롤러:

/* * @var $builder SymfonyComponentFormFormBuilderInterface */ $formTicket = $this->get('form.factory')->createNamed($tasksPerformedForm->getBlockPrefix(), TaskAddToTicket::class, null, array('ticket'=>$ticket) ); 

폼:

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefined('ticket');
$resolver->setRequired('ticket');
$resolver->addAllowedTypes('ticket', Ticket::class);
$resolver->setDefaults(array(

'translation_domain'=>'AcmeForm',
'validation_groups'=>array('validation_group_001'),
'tasks' => null,
'ticket' => null,
)); }
public function buildForm(FormBuilderInterface $builder, array $options)
{
$this->setTicket($options['ticket']);
//This is required to set data inside the form!
$options['data']['ticket']=$options['ticket'];
$builder
->add('ticket',
HiddenType::class, array(

'data_class'=>'acmeTicketBundleEntityTicket',
 )
) ... }