在这一章我们会构建一个真正的登录表单。
有一个非常流行的开源bundle他叫Fosuserbundle,他可以替你完成很多下面我们要做的事情。本章构建一个登陆系统后,你会更好的理解它是如何工作的。因此,希望你在本章节后,不妨看看Fosuserbundle。
手动创建一个Bundle
让我们来创建一个新的UserBundle。我们可以使用命令行app/console generate:bundle来创建,但是我这次手动创建。其实很容易:
仅仅需要创建一个UserBundle目录,并在目录里创建一个空的UserBundle类。一个bundle只不过是一个目录和一个bundle类:
1 2 3 4 5 6 7 8 |
// src/Yoda/UserBundle/UserBundle.php namespace Yoda\UserBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; class UserBundle extends Bundle { } |
现在,我们只需要在AppKernel中激活它。
1 2 3 4 5 6 7 8 9 10 11 12 |
// app/AppKernel.php // ... public function registerBundles() { $bundles = array( // ... new Yoda\UserBundle\UserBundle(), ); // ... } |
登录表单控制器(Controller)
你需要创建一个Controller目录,在这个目录里添加一个SecurityController类。给这个类添加一个loginAction方法。他是用来渲染我们的登录表单:
1 2 3 4 5 6 7 8 9 10 11 |
// src/Yoda/UserBundle/Controller/SecurityController.php namespace Yoda\UserBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class SecurityController extends Controller { public function loginAction() { } } |
使用Annotation 路由
之前我们添加了loginAction,我们需要一个路由来让他能够访问。
首先添加Route annotation的命名空间:
1 2 3 4 5 6 7 8 9 |
// src/Yoda/UserBundle/Controller/SecurityController.php // ... use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class SecurityController extends Controller { // ... } |
现在,我们开始添加annotation路由配置的正确方法:
1 2 3 4 5 6 7 8 9 10 |
// src/Yoda/UserBundle/Controller/SecurityController.php // ... /** * @Route("/login", name="login_form") */ public function loginAction() { // ... todo still.. } |
最后,我们要添加一段代码在主routing.yml文件中,告诉symfony在UserBundle中使用annotation路由:
1 2 3 4 5 6 |
# app/config/routing.yml # ... user_routes: resource: "@UserBundle/Controller" type: annotation |
请记住,symfony永远不会自动查找路由文件,所以我们每次都要手动在这里添加。
酷-在你的浏览器中访问 /login。它已经不是404的错误页面了,这意味着该路径可以正常工作了。现在我们来填写控制器!
添加loginAction的逻辑
不要忘了添加SecurityContextInterface和Request类:
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 |
// src/Yoda/UserBundle/Controller/SecurityController.php namespace Yoda\UserBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Component\Security\Core\SecurityContextInterface; use Symfony\Component\HttpFoundation\Request; // ... class SecurityController extends Controller { /** * @Route("/login", name="login") */ public function loginAction(Request $request) { $session = $request->getSession(); // get the login error if there is one if ($request->attributes->has(SecurityContextInterface::AUTHENTICATION_ERROR)) { $error = $request->attributes->get( SecurityContextInterface::AUTHENTICATION_ERROR ); } else { $error = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR); $session->remove(SecurityContextInterface::AUTHENTICATION_ERROR); } return $this->render( 'AcmeSecurityBundle:Security:login.html.twig', array( // last username entered by the user 'last_username' => $session->get(SecurityContextInterface::LAST_USERNAME), 'error' => $error, ) ); } |
该方法只是呈现了一个登录模板:他不处理提交和不检查用户名和密码是否正确。还有另一层功能是,它会发现登录的错误信息并返回模板仅此而已。
使用Annotation 快捷方式渲染模板:
第一次使用我们要添加一个use声明,现在也把@Template方法放到注释中。loginAction返回数组即可渲染到模板中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// src/Yoda/UserBundle/Controller/SecurityController.php // ... use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; class SecurityController extends Controller { /** * @Route("/login", name="login_form") * @Template() */ public function loginAction() { // ... return array( // last username entered by the user 'last_username' => $session->get(SecurityContextInterface::LAST_USERNAME), 'error' => $error, ); } } |
@Template会自动呈现模板,我们省去了很多代码。这很酷。
请问下楼主,这个教程有英文原版地址吗?
你还是看中文吧。翻译很不错了。