当我想覆盖 FOSUserBundle 注册表单时,我遇到了问题。
交易是,在用户实体中,一些用户可以有一个“赞助商”(赞助商是同一实体的多对一),更明确地说,这是用户实体:
<?php
namespace Diz\UserBundle\Entity;
use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* create FK "sponsor_id" referenced to the id field on the same table
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="sponsor_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $sponsor;
public function __construct()
{
// import FOSUserBundle properities ->
parent::__construct();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set sponsor
*
* @param Dizsurf\UserBundle\Entity\User $sponsor
*/
public function setSponsor(\Dizsurf\UserBundle\Entity\User $sponsor)
{
$this->sponsor = $sponsor;
}
/**
* Get sponsor
*
* @return Dizsurf\UserBundle\Entity\User
*/
public function getSponsor()
{
return $this->sponsor;
}
}
你看 ?
然后,为了覆盖 RegistrationFormType,我在官方帮助下创建了一个:
<?php
namespace Diz\UserBundle\Form\Type;
use Symfony\Component\Form\FormBuilder;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;
class RegistrationFormType extends BaseType
{
public function buildForm(FormBuilder $builder, array $options)
{
parent::buildForm($builder, $options);
// add your custom field
$builder->add('sponsor', 'fos_user_username');
}
public function getName()
{
return 'diz_user_registration';
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Diz\UserBundle\Entity\User', // Ni de modifier la classe ici.
);
}
}
就这样 !看起来很简单!但...
为了简单地将用户名转换为用户实体,FOS 建议在构建器中使用“ fos_user_username ”。
对我来说好吧,但是当我测试这个表格时:
对于确实存在的赞助商,我收到此错误“请输入密码”。(当然我已经输入了两次密码..)。
但是当我向不存在的用户提交表单时,注册表已成功提交!
我做错了吗?感谢您的帮助 !;-)
迪兹达。