PHP ссылка на статический метод - PullRequest
0 голосов
/ 27 августа 2011

Я делаю что-то подобное в моем проекте:

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, но я не знаю, какой параметр передать ему

спасибо

Ответы [ 2 ]

1 голос
/ 27 августа 2011

Вы можете использовать

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

посмотрите, как он работает здесь на tehplayground.com

0 голосов
/ 30 августа 2011

Нет. Symfony\Bridge\Doctrine\Form\Type\EntityType принимает параметр query_builder и передает его Symfony\Bridge\Doctrine\Form\ChoiceList\EntityChoiceList.

Построитель запросов должен быть экземпляром Doctrine\ORM\QueryBuilder или Closure (анонимная функция).

Кроме того, call_user_func, как предложено macek, будет работать в большинстве случаев, но не будет работать в замыкании, поскольку имеет другую область видимости. Это может быть решено в PHP 5.4, но сейчас это просто не будет работать.

Я бы сделал это так же, как и вы, используя замыкание и вызывая статический метод из него.

РЕДАКТИРОВАТЬ: И то, что вы первоначально пытались сделать, тоже не сработает, потому что в этом случае вы уже вызывали бы статический метод. И это не то, что вы хотите. Вам нужно передать функцию, которая должна быть вызвана позднее.

...