Javascript Can';t重写FOSUserBundle ProfileFormType buildForm()函数

Javascript Can';t重写FOSUserBundle ProfileFormType buildForm()函数,javascript,php,angularjs,symfony,fosuserbundle,Javascript,Php,Angularjs,Symfony,Fosuserbundle,我一直在试图覆盖FOSUserBundle中的ProfileFormType。我按照问题中的步骤进行操作,因为我当前的任务与前一个类似,所以问题已经解决。(我使用AngularJS作为前端) 不幸的是,我似乎无法从父类重写buildForm()函数 我已经记录了表单错误,上面写着: 错误:此表单不应包含额外字段 当前密码: 错误:此值应为用户的当前密码 服务.yml services: acme.profile.form.type: class: Acme\Bulleti

我一直在试图覆盖FOSUserBundle中的ProfileFormType。我按照问题中的步骤进行操作,因为我当前的任务与前一个类似,所以问题已经解决。(我使用AngularJS作为前端)

不幸的是,我似乎无法从父类重写buildForm()函数

我已经记录了表单错误,上面写着:

错误:此表单不应包含额外字段

当前密码:

错误:此值应为用户的当前密码

服务.yml

services:
    acme.profile.form.type:
        class: Acme\BulletinBundle\Form\Type\ProfileFormType
        arguments: ["%fos_user.model.user.class%"]
        tags:
            - { name: form.type, alias: acme_user_profile }
config.yml

fos_user:
    profile:
        form:
            type: acme_user_profile
ProfileFormType.php

namespace Acme\BulletinBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class ProfileFormType extends AbstractType {

    private $class;

    public function __construct($class) {
        $this->class = $class;
    }

    public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle'))
            ->add('email', 'email', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle'));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
        'data_class' => $this->class,
        'intention' => 'profile',
        'csrf_protection' => false,
        ));
    }

    public function getParent() {
        return 'fos_user_profile';
    }

    public function getName() {
        return 'acme_user_profile';
    }
}
UserController.php

/**
 * @Method("POST")
 * @Route("/user/edit", name="user_edit", options={"expose"=true})
 */
public function editAction(Request $request) {
    $id = $request->request->get('id');
    $user = $this->getDoctrine()
            ->getManager()
            ->getRepository("AcmeBulletinBundle:User")
            ->find($id);

    /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
    $formFactory = $this->get('fos_user.profile.form.factory');

    $form = $formFactory->createForm();
    $form->setData($user);

    $form->handleRequest($request);

    if ($form->isValid()) {
        /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
        $userManager = $this->get('fos_user.user_manager');
        $userManager->updateUser($user);
        return new JsonResponse(['valid' => true]);
    }
    $errs = (string) $form->getErrors(true, false);
    return new JsonResponse(['valid' => $errs]);
}
edit.html

<form class="form-group text-left" ng-submit="submit()" novalidate name="userFrm">
    <div class="form-group">
        <label for="user.email" class="required">Email</label>
        <input id="user.email" name="user.username" class="form-control" required type="text" ng-model="user.email" />
    </div>
    <div class="form-group">
        <label for="user.username" class="required">Username</label>
        <input id="user.username" name="user.username" class="form-control" required type="text" ng-model="user.username" />
    </div>

    <input type="submit" value="Update" ng-disabled="userFrm.$invalid"  class="btn btn-primary center-block col-lg-2" />
</form>

问题是您正在扩展配置文件表单,但表单模板中不存在任何主字段。从表单类型中删除以下行:

public function getParent() {
    return 'fos_user_profile';
}

或者将缺少的字段
current\u password
添加到
edit.html

我通常以不同的方式覆盖配置文件表单。尝试扩展fosprofiletype表单,并在buildForm方法中调用
父::buildForm
,但这对我不起作用。它会抛出一个内部服务器错误谢谢!成功了。事实证明,没有必要继承ProfileFormType。
public function getParent() {
    return 'fos_user_profile';
}