一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

symfony表单提交处理示例

时间:2022-06-25 02:49:09 编辑:袖梨 来源:一聚教程网


获取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部分,它可以让你的程序变得清晰和更加详细。

热门栏目