5

我正在尝试覆盖SonataUser/Admin/Model/UserAdmin's configureFormFields(),因为我需要从管理表单中删除一些默认字段。所以我复制了vendor/bundles/Sonata/UserBundle/Admin/Model/UserAdmin.php我的包中的文件app/Application/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 }

现在问题:我做得对吗?我怎样才能告诉奏鸣曲管理员使用它?

4

2 回答 2

16

覆盖类应该在 config.yml 中设置:

# app/config/config.yml
sonata_user:
  admin:
    user:
      class:      MyCompany\UserBundle\Admin\Model\UserAdmin

扩展原来的 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以反映您的包结构。

于 2013-12-31T12:26:44.143 回答
2

最好将包保存在 src 目录中:(请参阅创建包部分)。在这种情况下,如果您使用的是简单扩展,请确保使用--dest=src以在 src/ 中的应用程序命名空间内生成包。

php app/console sonata:easy-extends:generate SonataUserBundle --dest=src

通过在其中创建覆盖包src/Application/Sonata/UserBundle并将供应商包注册为父包,您不必创建新服务。这向您解释了如何正确覆盖捆绑包:覆盖捆绑包应该可以节省大量时间。

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

于 2012-07-10T13:17:02.783 回答