获取Request对象
首先,我们需要symfony的Request对象。为了能够得到它,我们要添加一个$request参数,并加上强制类型Request。
// src/Yoda/UserBundle/Controller/RegisterController.php
// ...
use SymfonyComponentHttpFoundationRequest;
class RegisterController extends Controller
{
// ...
public function registerAction(Request $request)
{
// ...
}
}
通常情况下,symfony在这里有一个参数,symfony会尝试从路由匹配规则来填充这个变量。如果没有找到,他会抛出一个巨大的错误。唯一的例外就是上面的例子:如果你传入一个Request类型的参数,他不会匹配路由规则。但这并不是适用于一切的,只是适用于Request方式的工作。
适用handleRequest
适用handleRequest方法来处理数据。接下来,添加一个if语句检查表单是否提交和数据是否有效:
// src/Yoda/UserBundle/Controller/RegisterController.php
use SymfonyComponentHttpFoundationRequest;
// ...
public function registerAction(Request $request)
{
$form = $this->createFormBuilder()
// ...
->getForm()
;
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// do something in a moment
}
return array('form' => $form);
}
该handleRequest方法会从request中抓取post数据,并进行处理,还会运行验证。有哪些验证呢比如:我们的程序是一个get请求,那么$form->isSubmitted()会返回false。
如果你的表单使用不同的http方法提交,你需要查看 form method。
如果是一个post请求并且验证通过,我们就输出提交的数据。如果表单无效或者是一个get请求,他就会跳过此
块重新渲染表单。
if ($form->isSubmitted() && $form->isValid()) {
var_dump($form->getData());die;
}
测试一下吧!我们虽然还没有添加验证,但是密码字段中已经内置了验证,如果不匹配。当我们提交表单时,重新渲染会出现错误。
在网页的debug工具条上,可以看到相关表单详细信息。
返回并正确填写表格信息。现在你会看到输出的数据:
array(
'username' => string 'foo' (length=3),
'email' => string '[email protected]' (length=11),
'password' => string 'foo' (length=3),
)
如何使用这个提交的数据
注意这个数组是每一个字段的键值对。让我们根据传过来的数据一一分配给User对象。这是很简单的方式:
// src/Yoda/UserBundle/Controller/RegisterController.php
use YodaUserBundleEntityUser;
// ...
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$user = new User();
$user->setUsername($data['username']);
$user->setEmail($data['email']);
}
编译用户密码
我们仍然需要对密码进行编译。现在让我们从fixtures复制一些代码到这里。
// src/Yoda/UserBundle/Controller/RegisterController.php
// ...
private function encodePassword(User $user, $plainPassword)
{
$encoder = $this->container->get('security.encoder_factory')
->getEncoder($user)
;
return $encoder->encodePassword($plainPassword, $user->getSalt());
}
使用这个函数完成persist并且flush这个新User:
// src/Yoda/UserBundle/Controller/RegisterController.php
// ...
if ($form->isValid()) {
$data = $form->getData();
$user = new User();
$user->setUsername($data['username']);
$user->setEmail($data['email']);
$user->setPassword($this->encodePassword($user, $data['password']));
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
// we'll redirect the user next...
}
重定向到成功页
任何表单提交后,都会有重定向这个步骤-我们将他重定向到主页。首先,我们需要生成一个URL-就像我们在twig中的path()函数。在控制器中,用generateUrl函数实现同样的工作原理。
// src/Yoda/UserBundle/Controller/RegisterController.php
// ...
if ($form->isSubmitted() && $form->isValid()) {
// ...
$em->flush();
$url = $this->generateUrl('event');
}
跳转的话,要使用redirect函数:
if ($form->isSubmitted() && $form->isValid()) {
// ...
$url = $this->generateUrl('event');
return $this->redirect($url);
}
请记住,一个控制器总是会返回一个Response对象。redirect仅仅是一个快捷方法,它去创建一个响应 ,跳转到设置的url上。
好了,正如预期的那样,我们来到了首页。甚至可以用新的用户登录!
你可以不使用isSubmitted
返回控制器并移除if语句中的isSubmitted():
// src/Yoda/UserBundle/Controller/RegisterController.php
$form->handleRequest($request);
if ($form->isValid()) {
// ...
}
这样做不会改变程序的,因为isValid()会自动判断表单提交-这意味着,如果请求不是POST,也会返回false。 如果你非要添加isSubmitted部分,它可以让你的程序变得清晰和更加详细。