让我们的网站增加一个注册表单。去喝点咖啡吧,因为我们马上就要学习一些表单和验证的强大知识。
创建注册页面
让我们在UserBundle中创建一个新的RegisterController类。手动创建控制器很简单:只需要添加命名空间,然后继承symfony的controller基类。创建一个registerAction方法来渲染我们的注册页面:
1 2 3 4 5 6 7 8 9 10 11 12 |
// src/Yoda/UserBundle/Controller/RegisterController.php namespace Yoda\UserBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class RegisterController extends Controller { public function registerAction() { // todo } } |
我们继续用annotation路由。记住,要这样做需要两个步骤:首先,添加路由之前要声明。然后,就可以在方法上标注了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// src/Yoda/UserBundle/Controller/RegisterController.php // ... use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class RegisterController extends Controller { /** * @Route("/register", name="user_register") */ public function registerAction() { // todo } } |
其次,把此路由写入到routing.yml。嗨!我们已经把整个控制器目录都设成annotations,所以不用在写入了。已经ok了。
1 2 3 4 5 6 |
# app/config/routing.yml # ... user_routes: resource: "@UserBundle/Controller" type: annotation |
输入命令看看路由是否加载:
1 |
php app/console router:debug |
是的,看到了!
创建表单
现在让我们构建表单,构建的表单是一个对象,知道我们想要的所有字段和类型,并能够帮助我们呈现出来。我非常喜欢他。
首先调用createFormBuilder()方法。然后使用add函数去传入表单的username、email和password字段:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// src/Yoda/UserBundle/Controller/RegisterController.php public function registerAction() { $form = $this->createFormBuilder() ->add('username', 'text') ->add('email', 'text') ->add('password', 'password') ->getForm() ; // todo next - render a template } |
add函数要传入两个参数一个是字段,一个是字段类型。symfony带有很多内置类型如text,select、date,在symfony官方文档中很容易找到。
我们填写完add后,调用getForm()。
在Twig中呈现表单
我想要去渲染表单,所有我们要把这个form对象传给Twig。使用annotation的@Template渲染页面,并返回form变量给Twig:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// src/Yoda/UserBundle/Controller/RegisterController.php /** * @Route("/register", name="user_register") * @Template */ public function registerAction() { $form = $this->createFormBuilder() // ... ->getForm() ; return array('form' => $form); } |
提示:上面的代码有一些错误,下面来解决这些问题。
让@Template注释可用
我们创建一个Twig模版。根据我们的RegisterController和@Template找到模版路径为Resources/views下的Register目录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{# src/Yoda/UserBundle/Resources/views/Register/register.html.twig #} {% extends '::base.html.twig' %} {% block stylesheets %} {{ parent() }} <link rel="stylesheet" href="{{ asset('bundles/user/css/login.css') }}" /> {% endblock %} {% block body %} <section class="login"> <article> <h1>Register</h1> </article> </section> {% endblock %} |
让我们看看浏览器页面的情况。当我们输入一个/register,你会看到一个非常漂亮的页面。哈哈,那是不可能的!我们应该会看到一个巨大的错误。
有时错误是嵌套的,并且最有帮助的很可能在下面。
仔细看看,包含的错误。啊明白了,我们使用了@Template却忘了use声明它。
1 2 3 4 |
// src/Yoda/UserBundle/Controller/RegisterController.php // ... use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; |