Пользовательская проверка в symfony2
Я новичок в symfony. Я решил переместить свое колесо с Symfony версии 2.
в моей форме пользователя:
- Я хотел бы проверить уникальность электронной почты в базе данных .
- Я хотел бы также проверить пароль с полем подтверждения пароля .
- я мог бы найти любую помощь в документе symfony2.
6 ответов
этот материал занял у меня некоторое время, чтобы выследить тоже, так что вот что я придумал. Честно говоря, я не совсем уверен в методе getRoles() объекта User, но это просто тестовая настройка для меня. Контекстные элементы, подобные этому, предоставляются исключительно для ясности.
вот некоторые полезные ссылки для дальнейшего чтения:
- ограничение проверки, которое заставляет уникальность
- тип поля для повторной проверки (двойная запись) поля
Я настроил все это, чтобы убедиться, что он работает как UserProvider для безопасности, так как я полагал, что вы, вероятно, делаете это. Я также предположил, что вы используете электронную почту в качестве имени пользователя, но вам не нужно. Вы можете создать отдельное поле username и использовать его. См.безопасность для получения дополнительной информации.
сущность (только важные части; автогенерируемые геттеры/сеттеры опущены):
namespace Acme\UserBundle\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\HasLifecycleCallbacks()
*
* list any fields here that must be unique
* @DoctrineAssert\UniqueEntity(
* fields = { "email" }
* )
*/
class User implements UserInterface
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length="255", unique="true")
*/
protected $email;
/**
* @ORM\Column(type="string", length="128")
*/
protected $password;
/**
* @ORM\Column(type="string", length="5")
*/
protected $salt;
/**
* Create a new User object
*/
public function __construct() {
$this->initSalt();
}
/**
* Generate a new salt - can't be done as prepersist because we need it before then
*/
public function initSalt() {
$this->salt = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',5)),0,5);
}
/**
* Is the provided user the same as "this"?
*
* @return bool
*/
public function equals(UserInterface $user) {
if($user->email !== $this->email) {
return false;
}
return true;
}
/**
* Remove sensitive information from the user object
*/
public function eraseCredentials() {
$this->password = "";
$this->salt = "";
}
/**
* Get the list of roles for the user
*
* @return string array
*/
public function getRoles() {
return array("ROLE_USER");
}
/**
* Get the user's password
*
* @return string
*/
public function getPassword() {
return $this->password;
}
/**
* Get the user's username
*
* We MUST have this to fulfill the requirements of UserInterface
*
* @return string
*/
public function getUsername() {
return $this->email;
}
/**
* Get the user's "email"
*
* @return string
*/
public function getEmail() {
return $this->email;
}
/**
* Get the user's salt
*
* @return string
*/
public function getSalt() {
return $this->salt;
}
/**
* Convert this user to a string representation
*
* @return string
*/
public function __toString() {
return $this->email;
}
}
?>
класс формы:
namespace Acme\UserBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class UserType extends AbstractType {
public function buildForm(FormBuilder $builder, array $options) {
$builder->add('email');
/* this field type lets you show two fields that represent just
one field in the model and they both must match */
$builder->add('password', 'repeated', array (
'type' => 'password',
'first_name' => "Password",
'second_name' => "Re-enter Password",
'invalid_message' => "The passwords don't match!"
));
}
public function getName() {
return 'user';
}
public function getDefaultOptions(array $options) {
return array(
'data_class' => 'Acme\UserBundle\Entity\User',
);
}
}
?>
Контроллер:
namespace Acme\UserBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Acme\UserBundle\Entity\User;
use Acme\UserBundle\Form\Type\UserType;
class userController extends Controller
{
public function newAction(Request $request) {
$user = new User();
$form = $this->createForm(new UserType(), $user);
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
if ($form->isValid()) {
// encode the password
$factory = $this->get('security.encoder_factory');
$encoder = $factory->getEncoder($user);
$password = $encoder->encodePassword($user->getPassword(), $user->getSalt());
$user->setPassword($password);
$em = $this->getDoctrine()->getEntityManager();
$em->persist($user);
$em->flush();
return $this->redirect($this->generateUrl('AcmeUserBundle_submitNewSuccess'));
}
}
return $this->render('AcmeUserBundle:User:new.html.twig', array (
'form' => $form->createView()
));
}
public function submitNewSuccessAction() {
return $this->render("AcmeUserBundle:User:submitNewSuccess.html.twig");
}
соответствующий раздел безопасности.в формате YML:
security:
encoders:
Acme\UserBundle\Entity\User:
algorithm: sha512
iterations: 1
encode_as_base64: true
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
main:
entity: { class: Acme\UserBundle\Entity\User, property: email }
firewalls:
secured_area:
pattern: ^/
form_login:
check_path: /login_check
login_path: /login
logout:
path: /logout
target: /demo/
anonymous: ~
проверить http://github.com/friendsofsymfony существует UserBundle, который имеет эту функциональность. Вы также можете проверить http://blog.bearwoods.com где есть сообщение в блоге о добавлении настраиваемого поля, ограничения и валидатора для Recaptcha.
ресурсы Thoose должны помочь вам начать правильный путь, если вы все еще сталкиваетесь с проблемами, люди обычно полезны и дружелюбны в irc в #symfony-dev в сети Freenode. На Freenoce существует также общий канал #symfony, где вы можете задать вопросы о том, как использовать материал, где #symfony-dev предназначен для разработки ядра Symfony2.
надеюсь, это поможет вам двигаться вперед с вашим проектом.
Я думаю, что главное, что вам нужно искать при создании пользовательского валидатора, - это константа, указанная в методе getTargets ().
Если вы измените
self::PROPERTY_CONSTRAINT
в:
self::CLASS_CONSTRAINT
вы должны иметь доступ ко всем свойствам сущности, а не только к одному свойству.
Примечание: Если вы используете аннотации для определения ограничений, теперь вам нужно переместить аннотацию, которая определяет ваш валидатор вверх класса, как он теперь применим ко всей сущности, а не только к одному свойству.
вы должны быть в состоянии получить все, что вам понадобится docs. В частности,ограничения который имеет информацию о проверке электронной почты. Есть также документация по написанию пользовательские валидаторы.
Я сделал все как на http://symfony.com/doc/2.0/book/validation.html
мой конфиг:
validator.debit_card:
class: My\Validator\Constraints\DebitCardValidator
tags:
- { name: validator.constraint_validator, alias: debit_card }
пытался использовать его с
@assert:DebitCard
@assert:debitCard
@assert:debit_card
но это не срабатывает?
уникальный адрес электронной почты из базы данных
проверка.в формате YML
Панель Мониторинга\ArticleBundle\Entity\Article: ограничения: # - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: senderEmail - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: { поля: senderEmail, сообщение: это письмо уже существует }
пароль подтвердите пароль
$builder->add('password', 'repeated', array(
'first_name' => 'password',
'second_name' => 'confirm',
'type' => 'password',
'required' => false,
));