2011-08-27 257 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