Symfony форма аутентификации не запускается - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть тип формы:

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // ->add('email')
            ->add('username', TextType::class)
            ->add('password', PasswordType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
        ]);
    }
}

Пользователь объекта:

    class User implements UserInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\Email()
     */
    private $email;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\Length(min=2, minMessage="Nom trop petit")
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\Length(min=4, minMessage="Mot de passe trop petit")
     */
    private $password;

    /**
     * @Assert\EqualTo(propertyPath="password", message="Le mot de passe ne correspond pas")
     */
    public $confirm_password;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;
        return $this;
    }

    public function getUsername(): ?string
    {
        return $this->username;
    }

    public function setUsername(string $username): self
    {
        $this->username = $username;
        return $this;
    }

    public function getPassword(): ?string
    {
        return $this->password;
    }

    public function setPassword(string $password): self
    {
        $this->password = $password;
        return $this;
    }

    /**
     * @inheritDoc
     */
    public function getRoles()
    {
        return ["ROLE_USER"];
    }

    /**
     * @inheritDoc
     */
    public function getSalt()
    {
        // TODO: Implement getSalt() method.
    }

    /**
     * @inheritDoc
     */
    public function eraseCredentials()
    {
        // TODO: Implement eraseCredentials() method.
    }
}

Контроллер:

/**
 * @Route("/login", name="login")
 */
public function login()
{
    // the identification is done thanks Symfony security configuration

    return $this->render("security/login.html.twig", [
        "form" => $this->createForm(UserType::class )->createView()
    ]);
}

Файл конфигурации брандмауэра безопасности:

firewalls:
    main:
        anonymous: lazy
        provider: in_database
        form_login:
            login_path: security_login
            check_path: security_login
        logout:
            path: security_logout
            target: home

И представление:

{% extends 'base.html.twig' %}
{% block title %}Hello SecurityController!{% endblock %}
{% block body %}
    <h1>Login</h1>
    <form action="{{ path('security_login') }}" method="post">
        <div class="form-group">
            <input type="text" class="form-control" placeholder="Nom" required name="_username">
        </div>
        <div class="form-group">
            <input type="password" class="form-control" placeholder="Mot de passe" required name="_password">
        </div>
        <div class="form-group">
            <button type="submit" class="btn btn-success">Connexion</button>
        </div>
    </form>
{% endblock %}

С этим кодом выполняется идентификация.

Теперь я хочу использовать теги формы Twig в файле Twig следующим образом:

{{ form_start(form) }}
{{ form_row(form.username, {"attr": {"placeholder": "Nom", "name": "_username", "required": "required"}, "label": "Nom" }) }}
{{ form_row(form.password, {"attr": {"placeholder": "Mot de passe", "name": "_password", "required": "required"}, "label": "Mot de passe" }) }}
<button type="submit" class="btn btn-success">Valider</button>
{{ form_end(form) }}

Но когда я использую этот код, я получаю сообщение об ошибке:

Ключ "_username" должен быть строкой с указанием "NULL".

Обычно мои формы работают правильно. Почему здесь не работает форма?

Спасибо за ваши ответы.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Ваш логин аутентификации c не хорош. Выполните следующие действия: c ... https://symfony.com/doc/current/security/form_login_setup.html

0 голосов
/ 16 февраля 2020

Я думаю, что вы забыли обработать запрос формы в контроллере, для этого вам нужно ввести Symfony\Component\HttpFoundation\Request аргумент в ваш метод login(), пример ниже:

public function login(Request $request)
{
    $form->handleRequest($request);

    if (true === $form->isSubmitted() && true === $form->isValid()) {
        // stuff
    }
}

Также в брандмауэре , пожалуйста, измените form_login, путь маршрута неверен, так как в аннотации контроллера вы указали name="login":

form_login:
    login_path: login
    check_path: login
...