Php Symfony 4登录访问:无数据持久性

Php Symfony 4登录访问:无数据持久性,php,symfony,Php,Symfony,我需要做一个登录表单,允许已识别的访问者访问管理面板 我有一个表格作为管理员登录。只要有人想访问路径/admin*,就会重定向到此登录表单 但是,我在数据持久性方面有一个问题,似乎我从未登录过 My security.yaml文件: 我的主控制器: 我的HTML表单: 连接 PHP 在我的用户实体中,允许我仅创建由其电子邮件标识的管理员用户,我有: <?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Sy

我需要做一个登录表单,允许已识别的访问者访问管理面板

我有一个表格作为管理员登录。只要有人想访问路径
/admin*
,就会重定向到此登录表单

但是,我在数据持久性方面有一个问题,似乎我从未登录过

My security.yaml文件: 我的主控制器: 我的HTML表单:

连接
PHP 在我的用户实体中,允许我仅创建由其电子邮件标识的管理员用户,我有:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @UniqueEntity(
 *  fields={"email"},
 *  message="L'email que vous avez indiqué est déjà utilisé !"
 * )
 */
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)
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\Length(min="8", minMessage="Votre mot de passe doit faire au minimum {{limit}} caractères")
     */
    private $password;

     /**
     * @Assert\EqualTo(propertyPath="password", message="Vous n'avez pas tapé le même mot de passe")
     */
    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;
    }

    public function eraseCredentials() {}

    public function getSalt() {}

    public function getRoles() {
  return ['ROLE_ADMIN'];
    }

数据不会持久化,因为您不会将其持久化到任何地方。您只在控制器中呈现表单,但没有负责将数据保存在数据库中的代码

首先,您需要构建表单。您应该创建单独的类(例如UserType),负责呈现表单中的字段。您可以阅读有关构建表单的内容,在底部可以看到如何创建我上面提到的表单类型类

其次,您应该使用EntityManager来持久化用户数据并将其刷新到数据库中。现在你没有代码来负责这个。您可以阅读有关在Symfony应用程序中创建简单注册表的内容

控制器动作示例:

/**
 * @Route("/connexion", name="security_login")
 */
 public function login() 
{
    $user = $this->get('user_factory')->create();

    $form = $this->createForm(UserType::class, $user);

    $form->handleRequest($request);

    if ($form->isValid()) {
       $this->getDoctrine()->getManager()->persist($user);
       $this->getDoctrine()->getManager()->flush();

       $this->addFlash(FlashType::SUCCESS, 'Account was created');

       return $this->redirectToRoute('homepage');
    }

    return $this->render('admin/login.html.twig', [
        'form' => $form->createView(),
    ]);
}


用于登录路由的路径(即
/connexion
)不在您尝试验证用户身份的防火墙后面。最简单的解决方案是删除
防火墙的
模式
选项,因为您实际上不需要多个防火墙,
main
可以处理所有请求(除了
dev
防火墙排除的开发工具的请求).

那么,为什么您自己构建整个身份验证过程而对Symfony一无所知呢?您是否遵循登录表单中的“已创建帐户”这一官方信息?真正地此外,这不是处理Symfony中登录的方式。。。一点也不接近。
    <form action="{{ path('security_login') }}" method="post">
        <div class="form-group">
            <input type="email" class="form-control" placeholder="Adresse mail" 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>
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @UniqueEntity(
 *  fields={"email"},
 *  message="L'email que vous avez indiqué est déjà utilisé !"
 * )
 */
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)
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\Length(min="8", minMessage="Votre mot de passe doit faire au minimum {{limit}} caractères")
     */
    private $password;

     /**
     * @Assert\EqualTo(propertyPath="password", message="Vous n'avez pas tapé le même mot de passe")
     */
    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;
    }

    public function eraseCredentials() {}

    public function getSalt() {}

    public function getRoles() {
  return ['ROLE_ADMIN'];
    }
/**
 * @Route("/connexion", name="security_login")
 */
 public function login() 
{
    $user = $this->get('user_factory')->create();

    $form = $this->createForm(UserType::class, $user);

    $form->handleRequest($request);

    if ($form->isValid()) {
       $this->getDoctrine()->getManager()->persist($user);
       $this->getDoctrine()->getManager()->flush();

       $this->addFlash(FlashType::SUCCESS, 'Account was created');

       return $this->redirectToRoute('homepage');
    }

    return $this->render('admin/login.html.twig', [
        'form' => $form->createView(),
    ]);
}