创建一个注册表单是非常容易的 - 它事实上意味着,你只需要创建一个表单,表单将更新一些User的模型对象(这个例子是一个Doctrine实体)并保存它。

受欢迎的FOSUserBundle 提供了一个注册表单,重置密码表单和其他用户管理功能。

如果你先前没有一个User实体和能工作的登录系统,你要先从怎样从数据库加载安全用户开始。

你的User实体至少应该有以下字段:

username

他是用来登录的,除非你想用email来替代你的用户(在那种情况下,这个字段就不是必要的了)。

email

这是一条不错的信息,很值得收集。您也可以允许用户通过email登录。

password

编译的密码

plainPassword

这个字段不会被持久化:(注意没有上面的@ORM\Column)。他将临时存储注册表单的明文密码。此字段可以被验证,然后被用于password字段的填充。

添加了一些验证,你的类可能看起来像这样:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95// src/AppBundle/Entity/User.php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

use Symfony\Component\Validator\Constraints as Assert;

use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

use Symfony\Component\Security\Core\User\UserInterface;

/**

* @ORM\Entity

* @UniqueEntity(fields="email", message="Email already taken")

* @UniqueEntity(fields="username", message="Username already taken")

*/

class User implements UserInterface

{

/**

* @ORM\Id

* @ORM\Column(type="integer")

* @ORM\GeneratedValue(strategy="AUTO")

*/

private $id;

/**

* @ORM\Column(type="string", length=255, unique=true)

* @Assert\NotBlank()

* @Assert\Email()

*/

private $email;

/**

* @ORM\Column(type="string", length=255, unique=true)

* @Assert\NotBlank()

*/

private $username;

/**

* @Assert\NotBlank()

* @Assert\Length(max=4096)

*/

private $plainPassword;

/**

* The below length depends on the "algorithm" you use for encoding

* the password, but this works well with bcrypt.

*

* @ORM\Column(type="string", length=64)

*/

private $password;

// other properties and methods

public function getEmail()

{

return $this->email;

}

public function setEmail($email)

{

$this->email = $email;

}

public function getUsername()

{

return $this->username;

}

public function setUsername($username)

{

$this->username = $username;

}

public function getPlainPassword()

{

return $this->plainPassword;

}

public function setPlainPassword($password)

{

$this->plainPassword = $password;

}

public function setPassword($password)

{

$this->password = $password;

}

public function getSalt()

{

// The bcrypt algorithm doesn't require a separate salt.

// You *may* need a real salt if you choose a different encoder.

return null;

}

// other methods, including security methods like getRoles()

}

UserInterface要求要有一些其他的方法,并且你的security.yml文件需要被正确配置,来让User实体工作。更多完整的例子,参见实体提供器文章。

为什么限制4096密码 ¶

注意,plainPassword字段的最大长度是4096字符。为了安全起见(CVE-2013-5750),当编译它时,Symfony限制明文密码长度到4096字符。添加此约束来确保如果有人尝试了一个超长的密码,你的表单应该提示一个验证错误。

你需要添加这个约束到你应用程序任何需要用户提交明文密码的地方(如,修改密码表单)。唯一不需要你担心的就是你的登录表单,因为symfony安全组件会替你处理。

为实体创建一个表单 ¶

下一步,给User实体创建表单:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33// src/AppBundle/Form/UserType.php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;

use Symfony\Component\Form\FormBuilderInterface;

use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\Extension\Core\Type\EmailType;

use Symfony\Component\Form\Extension\Core\Type\TextType;

use Symfony\Component\Form\Extension\Core\Type\RepeatedType;

use Symfony\Component\Form\Extension\Core\Type\PasswordType;

class UserType extends AbstractType

{

public function buildForm(FormBuilderInterface $builder, array $options)

{

$builder

->add('email', EmailType::class)

->add('username', TextType::class)

->add('plainPassword', RepeatedType::class, array(

'type' => PasswordType::class,

'first_options' => array('label' => 'Password'),

'second_options' => array('label' => 'Repeat Password'),

)

);

}

public function configureOptions(OptionsResolver $resolver)

{

$resolver->setDefaults(array(

'data_class' => 'AppBundle\Entity\User',

));

}

}

这里有两个字段:email, username 和 plainPassword(重复确认输入的密码)。

探索更多关于表单组件的事情,请阅读表单指南。

处理表单提交 ¶

下一步,你需要一个控制器去处理表单渲染和提交。如果表单被提交,控制器执行验证并保存数据到数据库:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46// src/AppBundle/Controller/RegistrationController.php

namespace AppBundle\Controller;

use AppBundle\Form\UserType;

use AppBundle\Entity\User;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Symfony\Component\HttpFoundation\Request;

class RegistrationController extends Controller

{

/**

* @Route("/register", name="user_registration")

*/

public function registerAction(Request $request)

{

// 1) build the form

$user = new User();

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

// 2) handle the submit (will only happen on POST)

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {

// 3) Encode the password (you could also do this via Doctrine listener)

$password = $this->get('security.password_encoder')

->encodePassword($user, $user->getPlainPassword());

$user->setPassword($password);

// 4) save the User!

$em = $this->getDoctrine()->getManager();

$em->persist($user);

$em->flush();

// ... do any other work - like sending them an email, etc

// maybe set a "flash" success message for the user

return $this->redirectToRoute('replace_with_some_route');

}

return $this->render(

'registration/register.html.twig',

array('form' => $form->createView())

);

}

}

在安全配置中配置上面步骤3的编码器,来定义用于编译密码的算法:

1

2

3

4# app/config/security.ymlsecurity:encoders:AppBundle\Entity\User:bcrypt

1

2

3

4

5

6

7

8

9

10

11

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:srv="http://symfony.com/schema/dic/services"

xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

bcrypt

1

2

3

4

5

6// app/config/security.php

$container->loadFromExtension('security', array(

'encoders' => array(

'AppBundle\Entity\User' => 'bcrypt',

),

));

这个案例我们推荐使用bcrypt 算法。了解更多关于如何编码用户密码的细节请看安全章节。

如果您决定不使用注释方式的路由(如上),那么你需要创建一个这个控制器的路由:

1

2

3

4# app/config/routing.ymluser_registration:path: /registerdefaults:{ _controller:AppBundle:Registration:register }

1

2

3

4

5

6

7

8

9

10

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

AppBundle:Registration:register

1

2

3

4

5

6

7

8

9

10// app/config/routing.php

use Symfony\Component\Routing\RouteCollection;

use Symfony\Component\Routing\Route;

$collection = new RouteCollection();

$collection->add('user_registration', new Route('/register', array(

'_controller' => 'AppBundle:Registration:register',

)));

return $collection;

下一步,创建模板:

1

2

3

4

5

6

7

8

9

10{# app/Resources/views/registration/register.html.twig #}

{{ form_start(form) }}

{{ form_row(form.username) }}

{{ form_row(form.email) }}

{{ form_row(form.plainPassword.first) }}

{{ form_row(form.plainPassword.second) }}

Register!

{{ form_end(form) }}

1

2

3

4

5

6

7

8

9

10

11

<?php echo $view['form']->start($form) ?>

<?php echo $view['form']->row($form['username']) ?>

<?php echo $view['form']->row($form['email']) ?>

<?php echo $view['form']->row($form['plainPassword']['first']) ?>

<?php echo $view['form']->row($form['plainPassword']['second']) ?>

Register!

<?php echo $view['form']->end($form) ?>

参见如何自定义表单渲染,里面有更多细节。

更新你的数据库结构 ¶

如果你在这个教程中已经更新了User实体,你必须要使用下面的命令去更新数据库结构:

1$ php bin/console doctrine:schema:update --force

就是这样!来到/register来尝试一下吧!

注册表单只有Email(没有 Username) ¶

如果你想要你的用户通过email登录并不需要用户名,那么你可以从你的User实体中彻底移除他。相反,让getUsername()返回email属性:

1

2

3

4

5

6

7

8

9

10

11

12

13

14// src/AppBundle/Entity/User.php

// ...

class User implements UserInterface

{

// ...

public function getUsername()

{

return $this->email;

}

// ...

}

下一步,只更改你security.yml文件的providers 部分,以便Symfony知道如何去通过email属性加载你的用户来登录。参见如何自定义表单渲染。

添加一个“打上勾”的Checkbox ¶

有时,你想要一个“你接受这个条款和声明吗?”的Checkbox,出现在你的注册表单。唯一窍门,让你要去添加这个字段到你的表单中,而你永远不需要添加多余的termsAccepted属性到你的User实体。

要做到这一点,要添加一个termsAccepted字段到你的表单,但设置它的 mapped 选项为false:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20// src/AppBundle/Form/UserType.php

// ...

use Symfony\Component\Validator\Constraints\IsTrue;

use Symfony\Component\Form\Extension\Core\Type\CheckboxType;

use Symfony\Component\Form\Extension\Core\Type\EmailType;

class UserType extends AbstractType

{

public function buildForm(FormBuilderInterface $builder, array $options)

{

$builder

->add('email', EmailType::class);

// ...

->add('termsAccepted', CheckboxType::class, array(

'mapped' => false,

'constraints' => new IsTrue(),

))

);

}

}

constraints配置也被使用了,它允许我们添加验证,尽管没有User中没有termsAccepted属性。

使用php创建一个注册表单,如何实现一个简单的注册表单相关推荐

  1. c语言编辑问道注册登录程序,C语言实现简单的注册登陆功能

    之前在学习用C语言建立通讯录管理系统的时候有想过,怎么为每个用户单独设立通讯录,自然而然想到了最常见的注册与登陆功能,通过不同的账号达到单独设立通讯录的目的.肯定还存在许多问题,当给自己立个flag, ...

  2. 用java写注册表单_利用HTML表单标签编写一个注册页面

    今天我们来写一个注册页面 form表单 先来利用表单标签制作一个简单的注册页面,给大家说说标签的结构: 页面结构大体就是这样子的~ 利用HTML表单标签编写一个注册页面 表单标签: 所有需要提交到服务 ...

  3. angular js创建表单_如何优雅的使用 Angular 表单验证

    随便说说,这一节可以跳过 去年参加 ngChine 2018 杭州开发者大会的时候记得有人问我: Worktile 是什么时候开始使用 Angular 的,我说是今年(2018年) 3 月份开始在新模 ...

  4. 小程序之简单登录注册表单验证

    这段时间在做员工管理的小程序,前期在登录注册上花了不少功夫,今天就给大家分享下. 效果图,wxss的内容较简单,自己编写即可. ##主要内容 一.首先我是在util.js中引入表单正则验证规则,给予l ...

  5. 运用php制作一个表单,PHP 表单处理,一个简单的 HTML 表单

    PHP 超全局变量 $_GET 和 $_POST 用于收集表单数据(form-data). PHP - 一个简单的 HTML 表单,我们在平时运用PHP这门语言的时候,最频繁的是就是表单提交了.如:用 ...

  6. java注册登录小程序,详解小程序之简单登录注册表单验证

    这段时间在做员工管理的小程序,前期在登录注册上花了不少功夫,今天就给大家分享下. 效果图,wxss的内容较简单,自己编写即可. ##主要内容 一.首先我是在util.js中引入表单正则验证规则,给予l ...

  7. Html+CSS实现简单的注册表单

    目录 预览 教程如下 首先新建一个HTML文件 接下来,我们在body标签的内部编写网页的主题内容 新建一个CSS文件 label: input: .submit_btn: CSS  居中显示: 这就 ...

  8. InfoPath表单每增加一个表单产生一个自动增加ID序号

    第一步,在SHAREPOINT新建一个表单库,假设存放路么为:HTTP://WINOS.CN/ORDER 第二步,设计订单表单,在INFORPATH右边点击"数据源",然后选择&q ...

  9. java表单单击路径_Form表单中的action路径问题,form表单action路径《jsp---Servlet路劲问题》这个和上一个《jsp---Servlet》文章有关...

    Form表单中的action路径问题,form表单action路径 今天刚接触web,在用jsp和servlet做一个简单的登陆的时候在Form表单action属性和method属性的一些问题: 我遇 ...

最新文章

  1. 监理单位的组织与规划
  2. spring的基本配置和使用
  3. leetcode机器人运动范围Java_【LeetCode】面试题13. 机器人的运动范围
  4. oracle删除本地文件权限,使用 UNIX 权限保护文件
  5. 题目53:Goldbach's Conjecture
  6. 云原生时代,谁是容器的最终归宿?
  7. 大学计算机课第二章内容总结,第四周市政系《大学计算机基础》课程总结
  8. 2019.08.27BOM的六个子对象(1)
  9. SKNode的子类和常用的Action
  10. keyshot卡住了还能保存吗_Sketchup建模和渲染能取代3dsMax吗?
  11. 三校生计算机word基础知识,江西省2017年三校生计算机高考试卷
  12. 联阳IT6561方案设计|替代IT6561方案DP转HDMI转换|CS5218替代IT6561芯片设计
  13. Ng-Alain 菜单图标引入iconfront 版本9.5.5
  14. 使用GPO(Profile-Guided Optimization)优化程序
  15. 大数据Hadoop课程进度
  16. 软件测试教程编发中长发,真人教程︱短发、中发、长发的六款速成编发,手残党五分钟就能搞定!...
  17. JavaFx,Swing小程序画板,画图工具
  18. 【踩坑】ckeditor5缩进功能无法直接使用的问题解决,以及首行缩进功能
  19. 变频器按启动没反应_变频器常见故障处理
  20. MnistData的读取

热门文章

  1. 前端学习(525):等分布局
  2. shiro学习(17):easyui布局测试
  3. 第五十四期:MongoDB与MySQL:如何选择
  4. 74 param动作
  5. 玩转oracle 11g(25):手工删除oracle归档日志后操作步骤 和修改用户默认解锁时间
  6. Vue中token刷新及token过期的实现
  7. 简单聊聊模型的性能评估标准
  8. qtmessagebox对话框里自定义按钮文本_按钮你可以这样设计
  9. 小白兔生小白兔-菲波拉契数列问题
  10. 不确定屏幕大小的弹窗垂直居中(用了box方法)