Sonata 管理包,如何使用实体存储库类

Posted

技术标签:

【中文标题】Sonata 管理包,如何使用实体存储库类【英文标题】:Sonata admin bundle, how to use entity repository classes 【发布时间】:2012-07-05 00:51:54 【问题描述】:

    在 PropertyAdmin 中使用此代码扩展 Admin:

    public function createQuery($context = 'list')
       
    $user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
    $query = $this->getModelManager()->createQuery($this->getClass(), 'o');
    $query->where('o.Creator=:creator')->setParameter("creator", $user);
    return $query;
    
    

我能够将“列表”结果限制为“属于”登录管理员的人,即。仅由登录的管理员创建的属性(即实体)。

问题: 通过手动更改 URL(id 值如 1、2...),我可以编辑属于其他用户的属性。对于编辑操作,根本不调用上述查询。如何改变这种行为?

2.我可以从 PropertyRepository 类中获取它,而不是把查询放在控制器中吗?这样可以将逻辑保留在我可以为其编写单元测试的模型中。

3.我正在尝试: ProductAdmin 扩展了 AdminHelper .... AdminHelper 扩展了 Admin ....

但它无法从“D:_development\rent2\app/config\routing.yml”中导入资源“D:_development\rent2\app/config.”。

AdminHelper 是抽象类,但 Sonata 仍然读取它。有什么解决办法吗?

【问题讨论】:

【参考方案1】:

1.a) 对您的对象使用 ACL,CRUD controller 具有权限检查。

1.b) 重新定义编辑动作,确保用户尝试编辑属于他的属性,类似于Page Admin Controller,重新定义创建动作

2) 在控制器中 $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository($this->getClass());使您可以访问为此模型注册的存储库。可能没有其他方法可以从中获取服务容器和实体管理器。

3) 要创建您的管理类,您应该扩展 Sonata Admin:docs for this,这个问题似乎与我的奏鸣曲无关。能否提供 D:_development\rent2\app/config\routing.yml 的内容?

【讨论】:

1.好的,我将谷歌如何使用权限检查 2. 我通过分析 Admin 类解决了这个问题。它具有我在子类中继承的 getObject($id) 方法并解决了该问题。 3.由于许多其他问题,我重新安装了所有东西,现在它可以工作了。老实说,我不知道怎么做,但我会保留它:) 第 2 点。真的帮帮我:D

以上是关于Sonata 管理包,如何使用实体存储库类的主要内容,如果未能解决你的问题,请参考以下文章

Symfony & Sonata:如何将 javascript 添加到实体管理表单?

Sonata 管理包,操作对象

Sonata Admin 嵌套表单

Sonata 管理包:无法删除与 sonata_type_admin 的关系

Sonata + Fos_user - 如何仅显示与用户相关的实体?

SonataMediaBundle 与自定义实体一起使用