Symfony 重写用户管理表单

Symfony 重写用户管理表单,symfony,symfony-forms,symfony-sonata,sonata-admin,Symfony,Symfony Forms,Symfony Sonata,Sonata Admin,我试图覆盖SonataUser/Admin/Model/UserAdmin的configureFormFields(),因为我需要从管理表单中删除一些默认字段。 因此,我复制了我的bundleapp/Application/Sonata/UserBundle/Admin/Model/UserAdmin.php中的文件vendor/bundles/Sonata/UserBundle/Admin/Model/UserAdmin.php,并对其进行了修改。然后将其声明为服务: # app/applic

我试图覆盖
SonataUser/Admin/Model/UserAdmin
configureFormFields()
,因为我需要从管理表单中删除一些默认字段。 因此,我复制了我的bundle
app/Application/Sonata/UserBundle/Admin/Model/UserAdmin.php中的文件
vendor/bundles/Sonata/UserBundle/Admin/Model/UserAdmin.php
,并对其进行了修改。然后将其声明为服务:

# app/application/Sonata/UserBundle/Resources/config/services.yml
services:
    application_user.registration.form.type:
        class: Application\Sonata\UserBundle\Admin\Model\UserAdmin
        arguments: [%sonata_user.model.user.class%]
        tags:
            - { name: form.type, alias: application_user_admin }
现在有问题:
我做得对吗?如何告诉sonata管理员使用它?

更好的做法是将bundle保存在src目录中:(请参阅创建bundle)。 在这种情况下,如果您使用的是easy extends,请确保使用
--dest=src
,以便在src/中的应用程序命名空间内生成包

php app/console sonata:easy-extends:generate SonataUserBundle --dest=src
通过在
src/Application/Sonata/UserBundle
中创建覆盖包并将供应商包注册为父包,您将不必创建新服务。这说明了如何正确覆盖捆绑包:并且应该为您节省大量时间

不要忘记在与父包相同的位置创建要覆盖的文件。 在您的情况下,您必须将供应商提供的粘贴
SonataUser/Admin/Model/UserAdmin.php
复制到bundle
src/Application/Sonata/UserBundle/Admin/Model/UserAdmin.php
中,并根据需要对其进行修改。
这就是为什么重写bundle会如此有用

应在config.yml中设置重写类:

# app/config/config.yml
sonata_user:
  admin:
    user:
      class:      MyCompany\UserBundle\Admin\Model\UserAdmin
扩展原始用户管理员:

namespace MyCompany\UserBundle\Admin\Model;

use Sonata\AdminBundle\Form\FormMapper;

class UserAdmin extends \Sonata\UserBundle\Admin\Model\UserAdmin
{

    protected function configureFormFields(FormMapper $formMapper)
    {
        // new logic
    }

}

当然,更改类名
MyCompany\UserBundle\Admin\Model\UserAdmin
以反映您的捆绑包结构。

实际上我曾经扩展过SonataUser捆绑包(如中所述),它会自动创建扩展捆绑包的结构。默认情况下,它使用的是
/app/Application
,我之所以保留它,是因为在SonataUser文档中总是这样提到它。如果您不指定任何参数,文件将在app/Application/Sonata中生成。。。但是您可以使用--dest=src指定路径。我已经更新了我的答案。我看到了(我故意留下它,因为他们还在文档中使用此路径。我可能稍后会移动它)。问题更多的是如何告诉sonata使用我的新管理类。你仍然可以重写该类,而不是创建新服务。祝你好运:-)我就是这么做的(见我的问题),但是这个类没有被重写。