来自自定义字段的 symfony2 FOSUserBundle 数据不写入数据库
symfony2 FOSUserBundle data from the custom field do not write to the database
我阅读了很多次关于覆盖的文档,但我仍然不知道为什么这段代码不起作用。自定义字段 - 包有效但数据未保存在数据库中。
Company\UserBundle\Form\Type\RegistrationFormType.php
namespace Company\UserBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Doctrine\ORM\EntityRepository;
class RegistrationFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('phoneNumber', 'text', array('label' => 'Numer telefonu(opcjonalnie)', 'required' => false))
->add('package', 'integer', array('label' => 'Pakiet', 'required' => false ));
}
public function getParent()
{
return 'fos_user_registration';
}
public function getName()
{
return 'company_user_registration';
}
}
注册控制器是默认的。
<form action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register m-signup--form">
<h2>Zarejestruj się</h2>
<ul class="errorLog">
<div class="field">
<label for="fos_user_registration_form_email">Email</label>
{{ form_widget(form.email) }}
</div>
<div class="field">
<label for="fos_user_registration_form_username">Login</label>
{{ form_widget(form.username) }}
</div>
<div class="field">
{{ form_widget(form.plainPassword) }}
</div>
<div class="field">
<label for="fos_user_registration_form_phoneNumber">Numer telefonu <span>(opcjonalnie)</span></label>
{{ form_widget(form.phoneNumber) }}
</div>
<div class="field">
<label for="fos_user_registration_form_package">Pakiet</label>
{{ form_widget(form.package) }}
</div>
<span>{{ form_widget(form) }}</span>
<input type="submit" class="btn btn-dark" style="font-weight: bold;" value="Zarejestruj się" />
</form>
如有任何帮助,我将不胜感激。
Company\UserBundle\Entity\User.php
namespace Company\UserBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="company_user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @ORM\Column(type="integer", name="phone_number", nullable = true)
*/
public $phoneNumber;
/**
* @ORM\Column(type="integer", name="package")
*/
public $package;
/**
* @return mixed
*/
public function getPackage()
{
return $this->package;
}
/**
* @param mixed $package
*/
public function setPackage($package)
{
$this->package = $package;
}
/**
* @return mixed
*/
public function getPhoneNumber()
{
return $this->phoneNumber;
}
/**
* @param mixed $phoneNumber
*/
public function setPhoneNumber($phoneNumber)
{
$this->phoneNumber = $phoneNumber;
}
...
app\config\config.yml
fos_user:
db_driver: orm
firewall_name: main
user_class: Company\UserBundle\Entity\User
registration:
confirmation:
enabled: true
form:
type: company_user_registration
Company\UserBundle\Resources\config\services.yml
services:
company_user.password_resetting:
class: Company\UserBundle\EventListener\RegistrationCompleteListener
arguments: [@router, @doctrine.orm.entity_manager, @templating]
tags:
- { name: kernel.event_subscriber }
company_user.registration.form.type:
class: Company\UserBundle\Form\Type\RegistrationFormType
tags:
- { name: form.type, alias: company_user_registration }
RegistrationController.php
class RegistrationController extends Controller
{
public function registerAction(Request $request)
{
/** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
$formFactory = $this->container->get('fos_user.registration.form.factory');
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->container->get('fos_user.user_manager');
/** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
$dispatcher = $this->container->get('event_dispatcher');
$user = $userManager->createUser();
$user->setEnabled(true);
$event = new GetResponseUserEvent($user, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);
if (null !== $event->getResponse()) {
return $event->getResponse();
}
$form = $formFactory->createForm();
$form->setData($user);
$form->handleRequest($request);
if ($request->getMethod() == 'POST') {
$form->bind($request);
if ($form->isValid()) {
$event = new FormEvent($form, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);
$userManager->updateUser($user);
if (null === $response = $event->getResponse()) {
$url = $this->container->get('router')->generate('fos_user_registration_confirmed');
$response = new RedirectResponse($url);
}
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
return $response;
} else {
header('Content-Type: application/json');
$errors = array();
$errors = $this->getErrorMessages($form);
$errors["status"] = "error";
return new Response(json_encode($errors));
}
}
return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.' . $this->getEngine(), array(
'form' => $form->createView(),
));
}
//Listowanie błędów
private function getErrorMessages(\Symfony\Component\Form\Form $form) {
$errors = array();
foreach ($form->getErrors() as $key => $error) {
$template = $error->getMessageTemplate();
$parameters = $error->getMessageParameters();
foreach ($parameters as $var => $value) {
$template = str_replace($var, $value, $template);
}
$errors[$key] = $template;
}
if ($form->count()) {
foreach ($form as $child) {
if (!$child->isValid()) {
$errors[$child->getName()] = $this->getErrorMessages($child);
}
}
}
return $errors;
}
/**
* Tell the user to check his email provider
*/
public function checkEmailAction()
{
$email = $this->container->get('session')->get('fos_user_send_confirmation_email/email');
$this->container->get('session')->remove('fos_user_send_confirmation_email/email');
$user = $this->container->get('fos_user.user_manager')->findUserByEmail($email);
if (null === $user) {
throw new NotFoundHttpException(sprintf('The user with email "%s" does not exist', $email));
}
return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:checkEmail.html.' . $this->getEngine(), array(
'user' => $user,
));
}
/**
* Receive the confirmation token from user email provider, login the user
*/
public function confirmAction(Request $request, $token)
{
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByConfirmationToken($token);
if (null === $user) {
throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist', $token));
}
/** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
$dispatcher = $this->container->get('event_dispatcher');
$user->setConfirmationToken(null);
$user->setEnabled(true);
$event = new GetResponseUserEvent($user, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_CONFIRM, $event);
$userManager->updateUser($user);
if (null === $response = $event->getResponse()) {
$url = $this->container->get('router')->generate('fos_user_registration_confirmed');
$response = new RedirectResponse($url);
}
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_CONFIRMED, new FilterUserResponseEvent($user, $request, $response));
return $response;
}
/**
* Tell the user his account is now confirmed
*/
public function confirmedAction()
{
$user = $this->container->get('security.context')->getToken()->getUser();
if (!is_object($user) || !$user instanceof UserInterface) {
throw new AccessDeniedException('This user does not have access to this section.');
}
$url = $this->container->get('router')->generate('static_user_add_first');
$response = new RedirectResponse($url);
return $response;
}
protected function getEngine()
{
return $this->container->getParameter('fos_user.template.engine');
}
}
您是否正确 configure FOSUser (config.yml) ?
# app/config/config.yml
fos_user:
db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
firewall_name: main
user_class: YourApp\UserBundle\Entity\User #path to your custom User entity
另外,您的表单是否包含以下方法?
public function getParent()
{
return 'fos_user_registration';
}
public function getName()
{
return 'yourapp_user_registration';
}
您构建表单的方式让我提示了您的错误配置。您正在尝试添加已存在于 FOSUser 提供的注册表中的字段。
您的 buildForm 方法更可能如下所示:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('phoneNumber', 'text', array('label' => 'Numer telefonu(opcjonalnie)', 'required' => false))
->add('package', 'text', array('label' => 'Pakiet', 'required' => false ));
}
要完成这项工作,您必须将表单设为服务:
services:
yourapp_user.registration.form.type:
class: Path\To\Your\RegistrationFormType
tags:
- { name: form.type, alias: yourapp_user_registration }
并且 link 您的 config.yml 到上述服务:
fos_user:
# ...
registration:
form:
type: yourapp_user_registration
万岁!!我终于找到了!
问题出在 Listener 的 onRegistrationSuccess 函数中。以前的程序员用静态值调用那里的 setPackage 函数。当我删除它时,一切都开始工作。
Grégory Elhaimer 非常感谢您的参与和帮助。你很棒!
我阅读了很多次关于覆盖的文档,但我仍然不知道为什么这段代码不起作用。自定义字段 - 包有效但数据未保存在数据库中。
Company\UserBundle\Form\Type\RegistrationFormType.php
namespace Company\UserBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Doctrine\ORM\EntityRepository;
class RegistrationFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('phoneNumber', 'text', array('label' => 'Numer telefonu(opcjonalnie)', 'required' => false))
->add('package', 'integer', array('label' => 'Pakiet', 'required' => false ));
}
public function getParent()
{
return 'fos_user_registration';
}
public function getName()
{
return 'company_user_registration';
}
}
注册控制器是默认的。
<form action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register m-signup--form">
<h2>Zarejestruj się</h2>
<ul class="errorLog">
<div class="field">
<label for="fos_user_registration_form_email">Email</label>
{{ form_widget(form.email) }}
</div>
<div class="field">
<label for="fos_user_registration_form_username">Login</label>
{{ form_widget(form.username) }}
</div>
<div class="field">
{{ form_widget(form.plainPassword) }}
</div>
<div class="field">
<label for="fos_user_registration_form_phoneNumber">Numer telefonu <span>(opcjonalnie)</span></label>
{{ form_widget(form.phoneNumber) }}
</div>
<div class="field">
<label for="fos_user_registration_form_package">Pakiet</label>
{{ form_widget(form.package) }}
</div>
<span>{{ form_widget(form) }}</span>
<input type="submit" class="btn btn-dark" style="font-weight: bold;" value="Zarejestruj się" />
</form>
如有任何帮助,我将不胜感激。
Company\UserBundle\Entity\User.php
namespace Company\UserBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="company_user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @ORM\Column(type="integer", name="phone_number", nullable = true)
*/
public $phoneNumber;
/**
* @ORM\Column(type="integer", name="package")
*/
public $package;
/**
* @return mixed
*/
public function getPackage()
{
return $this->package;
}
/**
* @param mixed $package
*/
public function setPackage($package)
{
$this->package = $package;
}
/**
* @return mixed
*/
public function getPhoneNumber()
{
return $this->phoneNumber;
}
/**
* @param mixed $phoneNumber
*/
public function setPhoneNumber($phoneNumber)
{
$this->phoneNumber = $phoneNumber;
}
...
app\config\config.yml
fos_user:
db_driver: orm
firewall_name: main
user_class: Company\UserBundle\Entity\User
registration:
confirmation:
enabled: true
form:
type: company_user_registration
Company\UserBundle\Resources\config\services.yml
services:
company_user.password_resetting:
class: Company\UserBundle\EventListener\RegistrationCompleteListener
arguments: [@router, @doctrine.orm.entity_manager, @templating]
tags:
- { name: kernel.event_subscriber }
company_user.registration.form.type:
class: Company\UserBundle\Form\Type\RegistrationFormType
tags:
- { name: form.type, alias: company_user_registration }
RegistrationController.php
class RegistrationController extends Controller
{
public function registerAction(Request $request)
{
/** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
$formFactory = $this->container->get('fos_user.registration.form.factory');
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->container->get('fos_user.user_manager');
/** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
$dispatcher = $this->container->get('event_dispatcher');
$user = $userManager->createUser();
$user->setEnabled(true);
$event = new GetResponseUserEvent($user, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);
if (null !== $event->getResponse()) {
return $event->getResponse();
}
$form = $formFactory->createForm();
$form->setData($user);
$form->handleRequest($request);
if ($request->getMethod() == 'POST') {
$form->bind($request);
if ($form->isValid()) {
$event = new FormEvent($form, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);
$userManager->updateUser($user);
if (null === $response = $event->getResponse()) {
$url = $this->container->get('router')->generate('fos_user_registration_confirmed');
$response = new RedirectResponse($url);
}
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
return $response;
} else {
header('Content-Type: application/json');
$errors = array();
$errors = $this->getErrorMessages($form);
$errors["status"] = "error";
return new Response(json_encode($errors));
}
}
return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.' . $this->getEngine(), array(
'form' => $form->createView(),
));
}
//Listowanie błędów
private function getErrorMessages(\Symfony\Component\Form\Form $form) {
$errors = array();
foreach ($form->getErrors() as $key => $error) {
$template = $error->getMessageTemplate();
$parameters = $error->getMessageParameters();
foreach ($parameters as $var => $value) {
$template = str_replace($var, $value, $template);
}
$errors[$key] = $template;
}
if ($form->count()) {
foreach ($form as $child) {
if (!$child->isValid()) {
$errors[$child->getName()] = $this->getErrorMessages($child);
}
}
}
return $errors;
}
/**
* Tell the user to check his email provider
*/
public function checkEmailAction()
{
$email = $this->container->get('session')->get('fos_user_send_confirmation_email/email');
$this->container->get('session')->remove('fos_user_send_confirmation_email/email');
$user = $this->container->get('fos_user.user_manager')->findUserByEmail($email);
if (null === $user) {
throw new NotFoundHttpException(sprintf('The user with email "%s" does not exist', $email));
}
return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:checkEmail.html.' . $this->getEngine(), array(
'user' => $user,
));
}
/**
* Receive the confirmation token from user email provider, login the user
*/
public function confirmAction(Request $request, $token)
{
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByConfirmationToken($token);
if (null === $user) {
throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist', $token));
}
/** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
$dispatcher = $this->container->get('event_dispatcher');
$user->setConfirmationToken(null);
$user->setEnabled(true);
$event = new GetResponseUserEvent($user, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_CONFIRM, $event);
$userManager->updateUser($user);
if (null === $response = $event->getResponse()) {
$url = $this->container->get('router')->generate('fos_user_registration_confirmed');
$response = new RedirectResponse($url);
}
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_CONFIRMED, new FilterUserResponseEvent($user, $request, $response));
return $response;
}
/**
* Tell the user his account is now confirmed
*/
public function confirmedAction()
{
$user = $this->container->get('security.context')->getToken()->getUser();
if (!is_object($user) || !$user instanceof UserInterface) {
throw new AccessDeniedException('This user does not have access to this section.');
}
$url = $this->container->get('router')->generate('static_user_add_first');
$response = new RedirectResponse($url);
return $response;
}
protected function getEngine()
{
return $this->container->getParameter('fos_user.template.engine');
}
}
您是否正确 configure FOSUser (config.yml) ?
# app/config/config.yml
fos_user:
db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
firewall_name: main
user_class: YourApp\UserBundle\Entity\User #path to your custom User entity
另外,您的表单是否包含以下方法?
public function getParent()
{
return 'fos_user_registration';
}
public function getName()
{
return 'yourapp_user_registration';
}
您构建表单的方式让我提示了您的错误配置。您正在尝试添加已存在于 FOSUser 提供的注册表中的字段。
您的 buildForm 方法更可能如下所示:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('phoneNumber', 'text', array('label' => 'Numer telefonu(opcjonalnie)', 'required' => false))
->add('package', 'text', array('label' => 'Pakiet', 'required' => false ));
}
要完成这项工作,您必须将表单设为服务:
services:
yourapp_user.registration.form.type:
class: Path\To\Your\RegistrationFormType
tags:
- { name: form.type, alias: yourapp_user_registration }
并且 link 您的 config.yml 到上述服务:
fos_user:
# ...
registration:
form:
type: yourapp_user_registration
万岁!!我终于找到了! 问题出在 Listener 的 onRegistrationSuccess 函数中。以前的程序员用静态值调用那里的 setPackage 函数。当我删除它时,一切都开始工作。
Grégory Elhaimer 非常感谢您的参与和帮助。你很棒!