gpt4 book ai didi

Symfony/FOS - 将用户 id 变量传递给表单类型

转载 作者:行者123 更新时间:2023-12-02 16:40:10 25 4
gpt4 key购买 nike

我尝试从 CategoryType 表单中设置“作者”字段的值。我希望它是使用 FOS bundle 登录的当前用户的用户 ID。

我的 CategoryType 表单:

namespace My\CategoryBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CategoryType extends AbstractType
{
private $userId;

public function __construct(array $userId)
{
$this->userId = $userId;
}

/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('author')
->add('content')
;
}

/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'My\CategoryBundle\Entity\Category',
'auteur' => $this->userId
));
}

/**
* @return string
*/
public function getName()
{
return 'my_categorybundle_category';
}
}

和我的 Controller 操作:

public function addAction()
{
$category = new Category;
$user = $this->get('security.context')->getToken()->getUser();
$userId = $user->getId();

$form = $this->get('form.factory')->create(new CategoryType(), array( 'author' => $userId));

$request = $this->get('request');
if ($request->getMethod() == 'POST') {
$form->bind($request);

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

return $this->redirect($this->generateUrl('mycategory_voir',
array('id' => $category->getId())));
}
}
return $this->render('MyCategoryBundle:Category:add.html.twig',
array(
'form' => $form->createView(),
));
}

我在运行操作时发现此错误:

Catchable Fatal Error: Argument 1 passed to My\CategoryBundle\Form\CategoryType::__construct() must be an array, none given, called in /My/CategoryBundle/Controller/CategoryController.php on line 55 and defined in /My/CategoryBundle/Form/CategoryType.php line 13

我传递给表单的数组不是已经存在了吗?

最佳答案

你的问题就在这一行

$form = $this->get('form.factory')->create(new CategoryType(), array( 'author' => $userId));

您不满足 My\CategoryBundle\FormCategoryType::__construct() 的契约(Contract)。在这里,我们换个角度来看一下。

$form = $this->get('form.factory')->create(
new CategoryType(/* You told PHP to expect an array here */)
, array('author' => $userId)
);

作为第二个参数发送给 Symfony\Component\Form\FormFactory::create() 的数组最终会作为 $options 数组注入(inject) My\CategoryBundle\Form\CategoryType::buildForm()

据我所知,您有几种不同的方法可以解决此问题

  1. 更新参数签名并调用 My\CategoryBundle\FormCategoryType::__construct() 来传递/接收整个用户对象(不仅仅是他们的 id - 请记住您正在工作此时与 Doctrine 关系,而不是它们映射到的较低级别的外键)

    namespace My\CategoryBundle\Form;

    use My\CategoryBundle\Entity\User; /* Or whatver your User class is */
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;

    class CategoryType extends AbstractType
    {
    private $author;

    public function __construct( User $author )
    {
    $this->author = $author;
    }

    $form = $this->get('form.factory')->create(
    new CategoryType(
    $this->get('security.context')->getToken()->getUser()
    )
    );
  2. 不要将User注入(inject)到类型的构造函数中,只需让选项处理它

    namespace My\CategoryBundle\Form;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;

    class CategoryType extends AbstractType
    {
    private $userId;

    /**
    * @param FormBuilderInterface $builder
    * @param array $options
    */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder
    ->add('title')
    ->add('author', 'hidden', array('data'=>$options['author']))
    ->add('content')
    ;
    }

    /**
    * @param OptionsResolverInterface $resolver
    */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
    $resolver->setDefaults(array(
    'data_class' => 'My\CategoryBundle\Entity\Category'
    ));
    }

    /**
    * @return string
    */
    public function getName()
    {
    return 'my_categorybundle_category';
    }
    }
  3. 甚至不用费心将作者放入表单并让 Controller 处理它

    $form = $this->get('form.factory')->create(
    new CategoryType()
    , array('author' => $this->get('security.context')->getToken()->getUser() )
    );

    if ($request->getMethod() == 'POST') {
    $form->bind($request);

    if ($form->isValid()) {
    $category->setAuthor(
    $this->get('security.context')->getToken()->getUser()
    );
    $em = $this->getDoctrine()->getManager();
    $em->persist($category);
    $em->flush();

    return $this->redirect($this->generateUrl('mycategory_voir',
    array('id' => $category->getId())));
    }
    }
  4. 将表单类型转换为服务并使用 DI 容器来注入(inject)安全上下文

    app/config/config.yml

    services:
    form.type.my_categorybundle_category:
    class: My\CategoryBundle\Form\CategoryType
    tags:
    - {name: form.type, alias: my_categorybundle_category}
    arguments: ["%security.context%"]

    更新您的类型以接收安全上下文

    namespace My\CategoryBundle\Form;

    use Symfony\Component\Security\Core\SecurityContext;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;

    class CategoryType extends AbstractType
    {
    private $author;

    public function __construct( SecurityContext $security )
    {
    $this->author = $security->getToken()->getUser();
    }

    然后在您的 Controller 中,使用其服务名称创建表单

    $form = $this->get('form.factory')->create('my_categorybundle_category');

关于Symfony/FOS - 将用户 id 变量传递给表单类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19813503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com