现有用户 class 的 Symfony 登录表单

Symfony Login form with existing user class

我正在尝试使用(并理解)Security 在 Symfony 中的工作原理。我创建了一个登录表单,它适用于硬编码用户。

现在我想使用数据库中的现有用户 table。 table 包含所有必填字段,但列名不同。该实体也存在,但名称不同(例如 "customUserId" 而不是 "id")。

类似于("MAGIC_MAPPING"):

/**
 * @ORM\Table(name="custom_user_table")
 * @ORM\Entity
 */
class User implements UserInterface, \Serializable
{
    /**
     * @ORM\Column(name="customUserId", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @MAGIC_MAPPING so it links this to the mandatory "id" field
     */
    private $customUserId;

    ...
}

有没有办法映射我现有的字段,以便 Symfony 使用它们进行登录?或者至少我可以在不更改数据库结构的情况下使其工作(仅实体class)吗?

我已经从这个论坛和 Symfony 文档中尝试了一些操作,但它总是以我无法修复的丑陋错误结束。

有什么想法或线索吗?非常感谢您的帮助,我已经为此苦苦挣扎了几个小时...

您必须更改 security.yml 文件中的提供程序配置

这是一个示例,我使用我的管理员实体的电子邮件字段,我认为您可以对您的实体执行相同的操作

providers: administrator: entity: { class: Entity:Administrator, property: email }

尝试更改 table 的 ORM 文件。 使用命令提示符创建 ORM 文件。 然后编辑orm文件。

    <mapped-superclass name="FOS\UserBundle\Entity\User" table="your_table_name">
    /.../
   </mapped>

Benoît 的回答帮我弄明白了。我过于关注 Symfony 文档的创建过程,以至于我忘记了最重要的:UserInterface。不需要映射任何东西,只需实现这个接口和定义的方法,如:

public function getUsername() {
    return $this->customLogin;
}

然后更新提供商配置(感谢 Benoit):

providers:          

    db_sam_provider:
        entity:
            class: AppBundle:User
            property: customLogin 

其他部分符合Symfony文档:here and here