gpt4 book ai didi

symfony2 : How to add validation rules to username?

转载 作者:行者123 更新时间:2023-12-04 01:57:34 25 4
gpt4 key购买 nike

由于我正在扩展 BaseUser ,我没有房产$name在我的用户实体中。如何向其添加验证?我可以添加一个属性$username到这个实体?这是否会干扰或覆盖某些功能或验证或 native 提供给用户类的功能?
我回答这个问题:FOSUserBundle - Validation for username, password or email fields .
但是由于我使用了一堆注释验证,这对我不起作用。
后续问题 - 我在 fosUSerBundle 中看到了这一点XML 文件,用于验证用户是否具有用于使用已获取用户名的检查器。我没有获得该功能,如果我尝试添加与现有用户同名的用户,我的将直接显示 SQL 错误消息。这是否是因为我使用的注释一起覆盖了 XML 验证文件?

<?php
namespace BizTV\UserBundle\Entity;

use BizTV\UserBundle\Validator\Constraints as BizTVAssert;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;


use FOS\UserBundle\Model\User as BaseUser;

use Doctrine\ORM\Mapping as ORM;

use BizTV\BackendBundle\Entity\company as company;


class User extends BaseUser implements AdvancedUserInterface
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

//TODO: Add regex on $name for a-z, A-Z, 0-9 and _ (underscore)
//TODO: Add constraint on $name * @BizTVAssert\NameExists (and finish coding this constraint)

/**
* @var object BizTV\BackendBundle\Entity\company
*
* @ORM\ManyToOne(targetEntity="BizTV\BackendBundle\Entity\company")
* @ORM\JoinColumn(name="company", referencedColumnName="id", nullable=false)
*/
protected $company;

/**
* @var object BizTV\UserBundle\Entity\UserGroup
* @ORM\ManyToOne(targetEntity="BizTV\UserBundle\Entity\UserGroup")
* @ORM\JoinColumn(name="userGroup", referencedColumnName="id", nullable=true)
*/
protected $userGroup;
因此,我查看了此处( symfony2 using validation groups in form )并通过在构建表单时将其添加到 Controller 来尝试该解决方案。什么都没有发生(仍然直接跳转到 INSERT INTO SQL 错误)
    $entity  = new User();
$request = $this->getRequest();
$form = $this->createForm(new newUserType($tempCompany), $entity, array('validation_groups'=>'registration'));
$form->bind($request);
我还尝试在表单类中以这种方式设置此验证组“注册组”(应该为您提供唯一的用户和电子邮件验证“免费”):
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => array('registration'),
));
}
仍然没有任何 react 。保存时直接出现 SQL 错误。

最佳答案

我提前道歉。我不完全确定您是否要验证 $name属性(property)或$username属性(property),但我希望这为您指明了正确的方向。

添加 $name带有正则表达式验证的属性,它应该看起来像这样。未经测试,但这是我要开始的地方:

<?php

use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Component\Validator\Constraints as Assert;

/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @ORM\Column(type="string")
* @Assert\NotBlank(groups={"Registration","Profile"})
* @Assert\Regex(pattern="/^[a-zA-Z0-9_]+$/", groups={"Registration","Profile"})
*/
protected $name;

public function setName($name)
{
$this->name = $name;

return $this;
}

public function getName()
{
return $this->name;
}
}

唯一的 usernameCanonical 和 emailCanonical 验证是继承的,但它们在验证组中。有关验证组的更多信息 herehere .

到目前为止,在我看来,FOSUserBundle 将用户管理器用作各种存储库,因此您将希望使用它尽可能多地与存储层交互。这是 Controller 中的样子(同样,未测试):
// setting values manually
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->createUser();
$user->setName('Joe');
$user->setUsername('joeuser');
$user->setEmail('joe@gmail.com');
$user->setPlainPassword('secret');
$user->addRole('ROLE_EDITOR');

// persist to database
$userManager->updateUser($user);

// inherited validations that check for username and email uniqueness
// using validation group names 'Registration' and 'Profile'
$uniqueEmail = $user->getEmailCanonical();
$uniqueUsername = $user->getUsernameCanonical();

如果您使用的是表单构建器或捆绑包未提供的表单类型,则它可能如下所示:
// setting values from a form
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->createUser();

$form = $this->container->get('form.factory')
->createBuilder('form', $user, array('validation_groups' => 'Registration'))
->add('username', 'text')
->add('email', 'email')
->add('name', 'text')
->add('plainPassword', 'repeated', array(
'type' => 'password'
))
->getForm();

if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isValid()) {
$userManager->updateUser($user);

// redirect response
}
}

return $this->container->get('templating')->renderResponse($templateName, array(
'form' => $form->createView()
));

我希望这有帮助。如果我能提供更多细节,请告诉我。我会在这里发布我的一些代码,但我的实现有点不同。

关于symfony2 : How to add validation rules to username?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19706381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com