symfony 在表单中注入参数

symfony4 inject parameter in form

我有一个业务实体和一个 BusinessObject 实体,我想在创建新的 BusinessObject 时将 BusinessObject link 到当前业务。 例如,如果我的路线是 business/{id}/object/new,我希望对象与业务相关(感谢 id)。

在我的 BusinessObject 控制器中,我设法使用 @ParamConverter 来获取业务 ID。 在我的 BusinessObject 表单中,我将 HiddenType 放入我的业务条目中,因为我不希望它出现,并将 data 设置为 business_ID。 我在 configureOptions 中挣扎以获取业务 ID,我不知道如何从这里获取业务 ID。

BusinessObject 控制器(新路由):

/**
 * @Route("/{post_id}/new", name="business_object_new", methods="GET|POST")
 * @ParamConverter("business", options={"id" = "post_id"})
 */
public function new(Request $request,Business $business): Response
{
    $businessObject = new BusinessObject();

    $businessID = $business->getId();

    $form = $this->createForm(BusinessObjectType::class, $businessObject,array(
        'business_ID'=>$businessID,
    ));
    $form->handleRequest($request);

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

        return $this->redirectToRoute('business_object_index');
    }

    return $this->render('business_object/new.html.twig', [
        'business_object' => $businessObject,
        'business'=>$business,
        'form' => $form->createView(),
    ]);
}

BusinessObjectType:

class BusinessObjectType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder
        ->add('object',TextType::class)
        ->add('complement')
        ->add('status')
        ->add('durationExpected')
        ->add('durationAchieved')
        ->add('client')
        ->add('projectManager')
        ->add('business',HiddenType::class,array(
            'data' => $options['business_ID']

        ))
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => BusinessObject::class,
        'business_ID'=>Business::class
    ]);
}
}

使用这段代码,我得到一个错误 Expected argument of type "App\Entity\Business or null", "string" given. 我认为这与我的表单中的函数 configureOptions() 有关

方法可以是:

public function new(Request $request,Business $business): Response
{
    $businessObject = new BusinessObject();

    $form = $this->createForm(BusinessObjectType::class, $businessObject);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        // I suppose your setter is `setBusiness`, otherwise use more suitable one
        $businessObject->setBusiness($business);
        $em = $this->getDoctrine()->getManager();
        $em->persist($businessObject);
        $em->flush();

表单生成器是:

builder
    ->add('object',TextType::class)
    ->add('complement')
    ->add('status')
    ->add('durationExpected')
    ->add('durationAchieved')
    ->add('client')
    ->add('projectManager');   // No business field

另一个选择是 embed BusinessType 表单到 BusinessObjectType,你可以阅读更多关于表单嵌入 here.