Php Symfony2 FormType实体字段类型

Php Symfony2 FormType实体字段类型,php,forms,symfony,orm,entity,Php,Forms,Symfony,Orm,Entity,我有三个实体配置文件,汽车和行程。当用户(Profile)创建Trip时,他可以选择Car(只有他自己的)并将其分配给Trip。我知道字段必须是实体类型。但我不知道如何设置为选择当前用户的汽车列表(配置文件)。有什么想法吗?谢谢。看看这本Symfony食谱: 按用户过滤汽车,我想这个例子就是你需要的: $builder->add('car', 'entity', array( 'class' => '/path/to/entity/Car', 'pro

我有三个实体<代码>配置文件,
汽车
行程
。当用户(
Profile
)创建
Trip
时,他可以选择
Car
(只有他自己的)并将其分配给
Trip
。我知道字段必须是实体类型。但我不知道如何设置为选择当前用户的汽车列表(配置文件)。有什么想法吗?谢谢。

看看这本Symfony食谱:


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

$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'];
    }
 }

我是怎么说的。其他解决方案,即使我个人也不喜欢:

$form = $this->createForm(new MyFormType($userId), $object); 
在表单中,将其存储在受保护的变量中,以便稍后在查询中使用:

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

     protected $userId;

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

 }

您可以在这里找到答案:如何获得$userId?当我尝试通过SecurityContenterFace获取当前用户时,我得到了错误:可捕获的致命错误:参数1传递给Vputi\TripBundle\Form\Type\TripDriverType::\uu construct()必须实现接口Symfony\Component\Security\Core\SecurityContenterFace,未给出,我更新了上面的答案。还可以将其注入表单构造函数:newmyformtype($userId);谢谢你,伙计。你的答案就是我需要的。)请接受我的投票)以及我如何理解,即使我可以将表单声明为服务。嗯,我直到现在才遇到这种情况,但我认为对你来说,最好不要将表单作为服务使用。你可以向服务添加参数,但可以从parameters.yml或其他服务中添加一些参数,而不是像用户ID这样的参数。