如何覆盖 SonataUser 实体属性和表单?
How to override SonataUser entities properties and forms?
我正在使用 Symfony 2.7.x 和 Sonata Admin 2.3.x 以及 Sonata User 建立一个全新的项目。默认情况下,Sonata 添加了一堆无用的字段,我想尽可能保持我的实体干净。所以我的第一个问题是:
- 是否可以覆盖 Sonata 用户实体以利用一些无用的属性?怎么样?
现在作为问题的第二部分并且与此相关,我想创建或使用我自己的表单来添加新用户 and/or 组,因为使用默认组我无法添加角色。请参阅下图以了解我在说什么:
我应该可以从那里添加新的动态角色,但我不能。
- 这可能吗?如何?任何解决方法?
您可以通过直接扩展 FOSUserBundle
实体而不是 SonataUser 用户模型来摆脱 Sonata 属性。
更改您的用户实际扩展的实体:
use Sonata\UserBundle\Model\User as BaseUser;
以下内容:
use FOS\UserBundle\Entity\User as BaseUser;
然后,要从表单中删除无用的属性并可能添加新的属性,请覆盖默认的 sonata UserAdmin class:
1- 在您自己的包中创建一个名为 UserAdmin 的管理员 class。
2- 打开文件 vendor/sonata-project/user-bundle/Admin/Model/UserAdmin.php 并从中取出 configureFormFields
。将其粘贴到您自己的管理员中 class 并通过从基本表单构建器中删除无用的字段来仅保留您需要的字段。
class 可以看起来像:
use FOS\UserBundle\Model\UserManagerInterface;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Form\FormMapper;
class UserAdmin extends Admin // You can extends directly from SonataUserAdmin if it's easier for you
{
protected $userManager;
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
... The fields you keep ...
}
/**
* @param UserManagerInterface $userManager
*/
public function setUserManager(UserManagerInterface $userManager)
{
$this->userManager = $userManager;
}
/**
* @return UserManagerInterface
*/
public function getUserManager()
{
return $this->userManager;
}
}
3- 将新的 UserAdmin class 定义为服务
services:
sonata.user.admin.user:
class: YourOwnAdminBundle\Admin\UserAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: %sonata.user.admin.groupname%, label: "User", label_catalogue: %sonata.user.admin.label_catalogue%", icon: "%sonata.user.admin.groupicon%"}
arguments:
- ~
- %sonata.user.admin.user.entity%
- %sonata.user.admin.user.controller%
calls:
- [setUserManager, ["@fos_user.user_manager"]]
- [setTranslationDomain, ["%sonata.user.admin.user.translation_domain%"]]
然后,修改config.yml中sonata-user的配置:
sonata_user:
...
admin:
user:
class: YourOwnAdminBundle\Admin\UserAdmin
controller: SonataAdminBundle:CRUD
translation: SonataUserBundle
而且应该不错。
看看 this similar question 以防我忘记了什么或者你需要更多。
我正在使用 Symfony 2.7.x 和 Sonata Admin 2.3.x 以及 Sonata User 建立一个全新的项目。默认情况下,Sonata 添加了一堆无用的字段,我想尽可能保持我的实体干净。所以我的第一个问题是:
- 是否可以覆盖 Sonata 用户实体以利用一些无用的属性?怎么样?
现在作为问题的第二部分并且与此相关,我想创建或使用我自己的表单来添加新用户 and/or 组,因为使用默认组我无法添加角色。请参阅下图以了解我在说什么:
我应该可以从那里添加新的动态角色,但我不能。
- 这可能吗?如何?任何解决方法?
您可以通过直接扩展 FOSUserBundle
实体而不是 SonataUser 用户模型来摆脱 Sonata 属性。
更改您的用户实际扩展的实体:
use Sonata\UserBundle\Model\User as BaseUser;
以下内容:
use FOS\UserBundle\Entity\User as BaseUser;
然后,要从表单中删除无用的属性并可能添加新的属性,请覆盖默认的 sonata UserAdmin class:
1- 在您自己的包中创建一个名为 UserAdmin 的管理员 class。
2- 打开文件 vendor/sonata-project/user-bundle/Admin/Model/UserAdmin.php 并从中取出 configureFormFields
。将其粘贴到您自己的管理员中 class 并通过从基本表单构建器中删除无用的字段来仅保留您需要的字段。
class 可以看起来像:
use FOS\UserBundle\Model\UserManagerInterface;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Form\FormMapper;
class UserAdmin extends Admin // You can extends directly from SonataUserAdmin if it's easier for you
{
protected $userManager;
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
... The fields you keep ...
}
/**
* @param UserManagerInterface $userManager
*/
public function setUserManager(UserManagerInterface $userManager)
{
$this->userManager = $userManager;
}
/**
* @return UserManagerInterface
*/
public function getUserManager()
{
return $this->userManager;
}
}
3- 将新的 UserAdmin class 定义为服务
services:
sonata.user.admin.user:
class: YourOwnAdminBundle\Admin\UserAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: %sonata.user.admin.groupname%, label: "User", label_catalogue: %sonata.user.admin.label_catalogue%", icon: "%sonata.user.admin.groupicon%"}
arguments:
- ~
- %sonata.user.admin.user.entity%
- %sonata.user.admin.user.controller%
calls:
- [setUserManager, ["@fos_user.user_manager"]]
- [setTranslationDomain, ["%sonata.user.admin.user.translation_domain%"]]
然后,修改config.yml中sonata-user的配置:
sonata_user:
...
admin:
user:
class: YourOwnAdminBundle\Admin\UserAdmin
controller: SonataAdminBundle:CRUD
translation: SonataUserBundle
而且应该不错。
看看 this similar question 以防我忘记了什么或者你需要更多。