symfony-forms - theme - symfony form_row
Cómo pasar el parámetro al constructor FormType desde el controlador (2)
¡Gracias por tu tiempo! Lo resolví yo mismo:
Quité el parámetro del constructor NewsType y agregué los datos al campo de formulario postedBy usando $ array de opciones, y pasé los datos a la matriz $ options desde el controlador, por favor verifique lo siguiente:
NewsType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(''postedBy'', HiddenType::class, array(
''data'' => $options[''postedBy'']
)
)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
''postedBy'' => null,
));
}
Controlador
$form = $this->createForm(NewsType::class, $news, array(
''postedBy'' => $this->getUser()->getFullname(),
);
ACTUALIZACIÓN: utilice el código siguiente si desea acceder a $ options array desde addEventListener:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$postedBy = $event->getForm()->getConfig()->getOptions()[''postedBy''];
}
Espero que ayude a alguien!
En Symfony2.7 pude pasar el parámetro al constructor de tipo de formulario directamente desde el controlador al crear el formulario, sin embargo, en Symfony3 no puedo hacerlo.
Antes en Symfony2.7
$form = $this->createForm(new NewsType("posted_by_name"));
Después en Symfony3
$form = $this->createForm(NewsType::class); // no idea how to pass parameter?
Actualización: también quería acceder desde:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
// how to access posted_by_name here which is sent from controller
}
Cualquier ayuda será muy apreciada ...
Debes definir tu forma como servicio .
namespace AppBundle/Form/Type;
use App/Utility/MyCustomService;
use Symfony/Component/Form/AbstractType;
use Symfony/Component/Form/FormBuilderInterface;
use Symfony/Component/Form/Extension/Core/Type/SubmitType;
class NewsType extends AbstractType
{
private $myCustomService;
private $myStringParameter;
public function __construct(MyCustomService $service, $stringParameter)
{
$this->myCustomService = $service;
$this->myStringParameter = $stringParameter;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Your code
}
}
Agregue a su configuración de servicio:
#src/AppBundle/Resources/config/services.yml
services:
app.form.type.task:
class: AppBundle/Form/Type/NewsType
arguments:
- "@app.my_service"
- "posted_by_name"
tags:
- { name: form.type }