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()
,因为我需要从管理表单中删除一些默认字段。
因此,我复制了我的bundleapp/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
复制到bundlesrc/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使用我的新管理类。你仍然可以重写该类,而不是创建新服务。祝你好运:-)我就是这么做的(见我的问题),但是这个类没有被重写。