如何在Admin类中访问Symfony Sonata中的配置池?

时间:2016-07-19 13:28:42

标签: php symfony sonata-admin symfony-sonata

我有一个select(或选项)字段,它应该从返回数组的函数中获取所有选项。

这是定义选择字段的行;

->add('possibilities', 'choice', array('choices' => Crud::enumStatus()))

这是enumStatus函数;

public static function enumStatus()
{
    return array(
        '1' => 'Awaiting Approval',
        '2' => 'Partly Approved',
        '3' => 'Approved',
        '4' => 'Disapproved',
        '5' => 'Complete'
    );
}

我上面解释的内容完美无缺。但我真正想要的并不起作用。校长保持不变。

这就是我想要的;

->add('possibilities', 'choice', array('choices' => Crud::getUsers(array('Marketing', 'Human Resource Management'))))

与上述类相同的功能;

public function getUsers($roles)
{
    $queryBuilder = $this->getConfigurationPool()->getContainer()->get('doctrine')->getManager('admin')
            ->createQueryBuilder();                

    $queryBuilder->select('u.id, u.name')
                         ->from('Qi\Bss\BaseBundle\Entity\Admin\User', 'u')
                         ->innerJoin('u.businessRoles', 'r')
                         ->where('r.name IN (:roles)')
                         ->setParameter('roles', $roles)
                         ->orderby('u.name');        
    $result = $queryBuilder->getQuery()->getResult();       

    $users = array();
    foreach ($result as $key => $value) {
        $users[$value['id']] = $value['name'];
    }

    return $users;        
}

尝试我想要的时候的错误;

  

尝试调用方法" getConfigurationPool"在课堂上   " XX \ YYY \ QqqBundle \控制器\ OrderController"

错误消息中提到的控制器是控制器,其中 - > add()用于我的表单,而不是这两个函数的位置。

为什么第一个工作,但第二个不工作?有人可以向我解释一下吗?它与一个函数中的static有关吗?那我怎么能解决这个问题呢?什么是configurationPool以及如何获得它?

我使用了Sonata Admin Bundle和Symfony。

1 个答案:

答案 0 :(得分:1)

请查看此official doc

  

ConfigurationPool =>配置池所有Admin类实例   存储

$this->getConfigurationPool()我认为是来自Admin类的复制粘贴。

要在一个扩展CRUDController内访问配置池,您必须通过他的admin属性进行访问。

$this->admin->getConfigurationPool()

这是你职能部门的负责人:

public function getUsers($roles)
{
    $queryBuilder = $this->admin->getConfigurationPool()->getContainer()->get('doctrine')->getManager('admin')
            ->createQueryBuilder(); 

<强>更新

如果您的控制器是一个简单的symfony控制器,那么您只需要调用doctrine而不是抛出管理员...

$queryBuilder = $this->get('doctrine')->getManager('admin')
            ->createQueryBuilder();