我想通过编辑 FOSUserBundle 中的配置文件来添加其他项目。
我试图通过使用表单集合来解决。
实体/信息.php
namespace My\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="My\UserBundle\Repository\UserRepository")
*/
class Information
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column @ORM\Column(type="string", length=255, nullable=true)
*/
protected $website;
// .... and other information
/**
* @ORM\OneToOne(targetEntity="User", mappedBy="information", cascade={"persist", "merge"})
*/
protected $user;
// ....
}
实体/用户.php
// ...
public function __construct()
{
parent::__construct();
$this->information = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
/**
* @ORM\OneToOne(targetEntity="Information", inversedBy="user")
* @ORM\JoinColumn(referencedColumnName="id")
*/
protected $information;
/**
* Add information
*
* @param My\UserBundle\Entity\Information $information
* @return User
*/
public function addInformation(Information $information)
{
$this->information[] = $information;
return $this;
}
/**
* Remove information
*
* @param My\UserBundle\Entity\Information $information
*/
public function removeInformation(\My\UserBundle\Entity\Information $information)
{
$this->information->removeElement($information);
}
/**
* Get information
*
* @return Doctrine\Common\Collections\Collection
*/
public function getInformation()
{
return $this->information;
}
控制器/配置文件控制器
public function editAction()
{
$em = $this->container->get('doctrine')->getManager();
$own = $this->container->get('security.context')->getToken()->getUser();
$user = $em->getRepository('MyUserBundle:User')->find_one_with_info($own); //=> Left join information table
if (!is_object($user) || !$user instanceof UserInterface) {
throw new AccessDeniedException('This user does not have access to this section.');
}
if (count($user->getInformation()) == 0)
$user->addInformation(new Information());
$form = $this->container->get('fos_user.profile.form');
$formHandler = $this->container->get('fos_user.profile.form.handler');
$process = $formHandler->process($user);
// ...
表格/类型/信息类型
// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('website', 'text', array('required' => false))
// ... and other information
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'My\UserBundle\Entity\Information',
));
}
// ...
表单/类型/ProfileFormType
// ...
protected function buildUserForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle'))
->add('information', 'collection', array(
'type' => new InformationType(),
))
;
}
// ...
查看/个人资料/edit_content.html.twig
// ...
{% for info in form.information %}
<div class="_errors">
{{ form_errors(info.website) }}
</div>
<div class="_form_bar">
{{ form_widget(info.website) }}
</div>
// ... and other information
{% endfor %}
<div class="_errors">
{{ form_errors(form.current_password) }}
</div>
<div class="_form_bar">
{{ form_widget(form.current_password) }}
{{ form_label(form.current_password) }}
</div>
{{ form_widget(form) }}
// ...
我发送这个时发生错误。
警告:spl_object_hash() 期望参数 1 是对象,数组在 /path/to/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php 第 1375 行中给出
错误点:FOSUserBundle/Form/Handler/ProfileFormHandler.php
protected function onSuccess(UserInterface $user)
{
$this->userManager->updateUser($user); //=> error point
}
像邀请系统一样使用数据传输的正确方法是什么?
是否可以使用收集表格?