2011-08-27 156 views
0

我在做类似的东西在我的项目:PHP参考静态方法

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

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中解决,但现在它将无法正常工作。

我会这样做,就像使用闭包并从中调用静态方法一样。

编辑:而你最初试图做的也不会工作,因为在那种情况下,你会调用静态方法。这不是你想要的。你想要的是传递一个函数,这个函数稍后会被调用。

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") 

see it working here on tehplayground.com

+0

我没有得到的是这个$ er变量/它似乎不存在(即,我不能将它传递给函数,但当我做功能(EntityRepository $ er)时,它“出现” – Lem0n