自定义类和ContextErrorException中没有实体管理器

时间:2015-02-04 19:43:16

标签: symfony sonata-admin

我正在尝试在Sonata-Admin中创建自定义表单,我想从数据库中获取数据到选择框。 当我试图通过getEntityManager()获取数据时,我收到了错误

No entity manager defined for class \Admin\AdminBundle\Entity\Category

我尝试将实体管理器添加到service.yml中的第一个参数[下面的代码]

services:
  sonata.admin.category:
    class: Admin\AdminBundle\Admin\Category
    tags:
        - {name: sonata.admin, manager_type: orm, group: "Content", label: "Kategoria"}
    arguments:
        - @doctrine.orm.default_entity_manager
        - Admin\AdminBundle\Entity\Category
        - ~
    calls:
        - [ setTranslationDomain, [AdminAdminBundle]]

添加默认实体管理器后,我遇到错误:

ContextErrorException in RoutesCache.php line 47:
Warning: md5() expects parameter 1 to be string, object given

我也在添加我的ConfigureFormFields()函数:

protected function configureFormFields(FormMapper $formMapper){

$em = $this->modelManager->getEntityManager('\Admin\AdminBundle\Entity\Category');

$query = $em->createQueryBuilder('c')
    ->select('c')
    ->from('AdminBundle:Category', 'c')
    ->where('c.parent IS NOT NULL')
    ->orderBy('c.root, c.lft', 'ASC');


$formMapper
    ->add ('name', 'text', array('label' => 'Nazwa Kategorii'))
    ->add ('alias', 'text', array('label' => 'Alias'))
    ->add('parent_id', 'sonata_type_model', array(
        'required' => true,
        'query' => $query
    ));

有人可以帮我解决这个错误吗? 谢谢你的回答,

最好的问候!

1 个答案:

答案 0 :(得分:1)

您收到错误,因为在错误的地方添加经理。 admin服务的第一个参数应设置为 管理服务的代码(默认为服务名称)。

Admin class解析此字符串并构建一些基于的逻辑。你把管理员放在那里就会出错。

如果你想在管理类中添加一些东西,你可以简单地添加第四个参数(或第五个,第六个....),如:

 services:
   sonata.admin.category:
    class: Admin\AdminBundle\Admin\Category
    tags:
         - {name: sonata.admin, manager_type: orm, group: "Content", label: "Kategoria"}
     arguments:
         - ~ 
         - Admin\AdminBundle\Entity\Category
         - ~
         - @doctrine.orm.default_entity_manager
calls:
    - [ setTranslationDomain, [AdminAdminBundle]]

然后在您的管理类中,您必须更新覆盖构造函数,例如:

 public function __construct($code, $class, $baseControllerName, $yourManager)
 {
     parent::_construct($code, $class, $baseControllerName);
     $this->yourManager = $yourManager
 }