【问题标题】:Symfony2 FormType entity field typeSymfony2 FormType 实体字段类型
【发布时间】:2015-02-10 23:12:28
【问题描述】:

我有三个实体。 ProfileCarTrip。当用户(Profile)创建Trip时,他可以选择Car(只有他自己的)并将其分配给Trip。我知道该字段必须是实体类型。但我不知道如何设置选择列出当前用户(个人资料)的汽车。有任何想法吗?谢谢。

【问题讨论】:

标签: php forms symfony orm entity


【解决方案1】:

我是如何提到的。其他解决方案,即使我个人也不喜欢它:

$form = $this->createForm(new MyFormType($userId), $object); 

在您的表单中,将其存储在受保护的变量中,以便稍后在查询中使用:

/**
 * Class MyFormType
 */
 class MyFormType extends AbstractType
 {

     protected $userId;

     /**
      * @param $userId
      */
     public function __construct($userId) {
         $this->userId = $userId;
     }

 }

【讨论】:

  • 以及我如何理解即使我可以将我的表单声明为服务。
  • 嗯,直到现在我才遇到这种情况,但我认为对你来说最好不要将表单用作服务。
  • 您可以向服务添加参数,但一些来自 parameters.yml 或其他服务,而不是像用户 ID 这样的。
【解决方案2】:

按用户过滤汽车,我认为这个例子是你需要的:

$builder->add('car', 'entity', array(
    'class'         => '/path/to/entity/Car',
    'property'      => 'title',
    'empty_value'   => 'Choose a car',
    'query_builder' => function(EntityRepository $em) use ($userId) {
         return $em->createQueryBuilder('c')
             ->join('c.user', 'u')
             ->where('u.id = :userId')
             ->setParameter('userId', $userId);
         }
    )
)

您可以将 $userId 添加为一种表单选项:

$form = $this->createForm(new MyFormType(), $object, array( 'userId' => $userId ));

然后在您的表单中检索它:

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'userId' => function (Options $options, $value) {
            return $options['userId'];
        }
    ));
}

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    if($options['userId']){
        $userId = $options['userId'];
    }
 }

【讨论】:

  • 如何获取 $userId?当我尝试通过 SecurityContextInterface 获取当前用户时出现错误:可捕获的致命错误:传递给 Vputi\TripBundle\Form\Type\TripDriverType::__construct() 的参数 1 必须实现接口 Symfony\Component\Security\Core\SecurityContextInterface,没有给出,
  • 我在上面更新了我的答案。您也可以在表单构造函数中注入它: new MyFormType($userId);
  • 非常感谢。你的回答是我需要的。)接受我的投票)
【解决方案3】:
猜你喜欢
  • 1970-01-01
  • 2014-06-22
  • 2012-07-09
  • 1970-01-01
  • 2012-05-07
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
相关资源
最近更新 更多