symfony2如何注销呢?
来看看Security.yml的Logout
1 2 3 4 5 6 7 8 |
# app/config/security.yml # ... firewalls: secured_area: # ... logout: path: _demo_logout target: _demo |
path是你注销路由的名称。将其设置为logout-同样我们需要创建这样一个路由。target是当用户退出后重定向页面的。我们把target设置为_demo路由,后面我们会调整它:
1 2 3 4 5 6 7 8 |
# app/config/security.yml # ... firewalls: secured_area: # ... logout: path: logout # a route called logout target: _demo # a route called event |
下面来添加logout路由。在SecurityController里创建方法并使用@Route annotation:
1 2 3 4 5 6 7 8 9 |
// ... // src/Yoda/UserBundle/Controller/SecurityController.php /** * @Route("/logout", name="logout") */ public function logoutAction() { } |
就像loginCheckAction一样这里的代码不会实际运行。symfony会拦截请求,并为我们处理注销操作。尝试访问 /logout。太好了!你可以看到debug工具栏又变成了匿名用户。
整理loginAction
如果我们登录失败会看到一个“Bad Credentials”消息。Symfony处理登录时,这个错误会保存到session的一个特殊键里,而我们只是在loginAction抓取出来。
删除if语句,只留下两个部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// src/Yoda/UserBundle/Controller/SecurityController.php // ... public function loginAction(Request $request) { $session = $request->getSession(); // get the login error if there is one $error = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR); $session->remove(SecurityContextInterface::AUTHENTICATION_ERROR); return array( // last username entered by the user 'last_username' => $session->get(SecurityContextInterface::LAST_USERNAME), 'error' => $error, ); } |
如果使用use_forward,那么symfony会转发到login页面而不是重定向。
添加一个css
我知道登录页面很丑,所以我做了一个login.css文件来解决。
让我们创建它到UserBundle下的Resources/public/css目录:
1 2 3 4 5 6 7 |
/* src/Yoda/UserBundle/Resources/public/css/login.css */ .login { width: 500px; margin: 100px auto; } /* for the rest of login.css, see the code download */ |
运行 app/console assets:install 并添加 –symlink配置
1 |
php app/console assets:install --symlink |
symfony会将src/Yoda/UserBundle/Resources/public目录下的文件创建到web/bundles/user中去。这个web/就是你应用程序的根目录,使得浏览器可以访问到我们新的/bundles/user/css/login.css。
那我们怎么才能添加这个css到我们的页面呢?首先,打开base模板。在这里我们有一群blocks,其中有一个stylesheets块,我们可以把全局的css文件放到这里面:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# app/Resources/views/base.html.twig # ... {% block stylesheets %} {% stylesheets 'bundles/yodaevent/css/event.css' 'bundles/yodaevent/css/events.css' 'bundles/yodaevent/css/main.css' filter='cssrewrite' %} <link rel="stylesheet" href="{{ asset_url }}" /> {% endstylesheets %} {% endblock %} |
你发现我们不存在此EventBundle,所以我们要创建一个EventBundle。输入命令php app/console generate:bundle –namespace=Yoda/EventBundle
创建完成后,将public.rar里面的css和img文件夹拷贝到src/Yoda/EventBundle/Resources/public目录下。
再次运行
1 |
php app/console assets:install --symlink |
样式文件已经全部存在了。
让我们来看看继承他的login.html.twig文件并把login.css添加到页面:
1 2 3 4 5 |
{# src/Yoda/UserBundle/Resources/views/Security/login.html.twig #} {% block stylesheets %} <link rel="stylesheet" href="{{ asset('bundles/user/css/login.css') }}" /> {% endblock %} |
很棒,等等你会看到一些问题?它覆盖了之前base.html.twig的样式,但是我们不想这样。有一个秘诀就是使用twig的parent()函数。通过这样的方式父类块里的内容也被包入进来了:
1 2 3 4 5 6 7 |
{# src/Yoda/UserBundle/Resources/views/Security/login.html.twig #} {% block stylesheets %} {{ parent() }} <link rel="stylesheet" href="{{ asset('bundles/user/css/login.css') }}" /> {% endblock %} |
现在你刷新。好看一点了,所以说当你要添加css或者js到一个页面那么你就这样做。
我们还需呀加入少许的错误class,让它看起来更好些:
1 2 3 4 5 6 |
{# src/Yoda/UserBundle/Resources/views/Security/login.html.twig #} {# ... #} {% if error %} <div class="error">{{ error.message }}</div> {% endif %} |
下面我们要做的事情会让页面看起来更好,让我们打开base.html.twig,添加bootstrap的css文件:
1 2 3 4 5 6 7 8 |
{# app/Resources/views/base.html.twig #} {# ... #} {% block stylesheets %} <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"/> ... {% block stylesheets %} |
返回login.html.twig,调整一下提交按钮:
1 2 3 4 5 |
{# src/Yoda/UserBundle/Resources/views/Security/login.html.twig #} {# ... #} <hr/> <button type="submit" class="btn btn-primary pull-right">login</button> |
刷新好多了!虽然我不是美工,但是我希望他好看些!
翻译这些错误的登录信息
在这里我们看到的“Bad Credentials”消息提示,太有程序员的味道了,因为这个消息来自于symfony核心。所以我们要使用翻译来自定义它。
首先使用Twig trans 过滤这个消息:
1 2 3 4 5 6 |
{# src/Yoda/UserBundle/Resources/views/Security/login.html.twig #} {# ... #} {% if error %} <div class="error">{{ error.message|trans }}</div> {% endif %} |
接下来,我们创建一个translation文件在app/Resources/translations/messages.en.yml目录中。这个文件中仅仅是简单的键值对:
1 2 |
# app/Resources/translations/messages.en.yml Bad credentials. : 兄弟你的用户名或密码错误! |
现在,我只需要在app/config.yml文件中激活它就可以了
1 2 3 |
framework: # ... translator: { fallbacks: ["%locale%"] } |
现在好了,试试吧!
博主你好:
请问博主,public.rar在哪里下载得到?
这篇文章很不错,能够让你明白在传统表单下如何完成登陆和注册,如果您在最新版的symfony3.0下可能你要更新一些过时的函数。
实在抱歉!当时我写这些的时候,本想写完了以后将样式打包上传到服务器以供下载,但是我忘记了?当然他会影响程序的美观。
但并不影响程序的运行和理解,因为里面只是一些样式,如果你懂一些你可以自己写一些,也会更有个性。