我在我的项目中做了类似的事情:
use Doctrine\ORM\EntityRepository;
class ArticlesType extends AbstractType {
static function statusFilter(EntityRepository $er) {
return $er->createQueryBuilder('x')->where('x.status = 1');
}
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('User', 'entity', array('class' => 'FP\MyBundle\Entity\Users',
# 'query_builder' => call_user_func(array('self','statusFilter'), ??)
'query_builder' => function(EntityRepository $er) { return ArticlesType::statusFilter($er); }
))
}
}
关于如何对statusFilter方法进行“更好”调用的任何想法?
正如您所看到的,我尝试使用call_user_func,但我不知道要传递给哪个参数
感谢
答案 0 :(得分:1)
您可以使用
self::statusFilter($er);
或者,您可以使用
call_user_func(array('self', 'statusFilter'), $er);
我现在更好地理解这个问题。正如@igorw所说,Symfony期待关闭;但是,这并不意味着它不能写得更好。
您可以创建自定义帮助程序,然后在buildFom调用中使用它。
function funcRef($func){
return create_function('', "return call_user_func_array('{$func}', func_get_args());");
}
然后你可以在buildForm方法中使用它:
'query_builder' => funcRef("ArticlesType::statusFilter")
答案 1 :(得分:0)
没有。 Symfony\Bridge\Doctrine\Form\Type\EntityType
使用query_builder
选项并将其传递给Symfony\Bridge\Doctrine\Form\ChoiceList\EntityChoiceList
。
查询构建器需要是Doctrine\ORM\QueryBuilder
的实例或Closure
(匿名函数)。
此外,macek
建议的call_user_func在大多数情况下都可以使用,但它在闭包中不起作用,因为它具有不同的范围。这可以在PHP 5.4中解决,但是现在它根本不起作用。
我会像你一样,使用闭包并从中调用静态方法。
编辑:你最初尝试做的事情也不会起作用,因为在这种情况下你将会调用静态方法。这不是你想要的。你想要的是传递一个函数,该函数将在以后的某个时间调用。