<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Symfony中文教程 &#187; logout</title>
	<atom:link href="http://www.newlifeclan.com/symfony/archives/tag/logout/feed" rel="self" type="application/rss+xml" />
	<link>http://www.newlifeclan.com/symfony</link>
	<description>站在巨人肩膀上的phpweb框架</description>
	<lastBuildDate>Fri, 12 Dec 2025 00:58:27 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>KU案例2之05注销和整理</title>
		<link>http://www.newlifeclan.com/symfony/archives/409</link>
		<comments>http://www.newlifeclan.com/symfony/archives/409#comments</comments>
		<pubDate>Wed, 01 Apr 2015 07:47:09 +0000</pubDate>
		<dc:creator><![CDATA[napoleon]]></dc:creator>
				<category><![CDATA[实战教程]]></category>
		<category><![CDATA[logout]]></category>
		<category><![CDATA[translations]]></category>
		<category><![CDATA[注销]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://www.newlifeclan.com/symfony/?p=409</guid>
		<description><![CDATA[<p>symfony2如何注销呢？ 来看看Security.yml的Logout [crayon-6a0fcfb8b [&#8230;]</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/symfony/archives/409">KU案例2之05注销和整理</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/symfony">Symfony中文教程</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>symfony2如何注销呢？</p>
<p>来看看Security.yml的Logout</p>
<p><span id="more-409"></span></p><pre class="crayon-plain-tag"># app/config/security.yml
# ...
firewalls:
    secured_area:
        # ...
        logout:
            path:   _demo_logout
            target: _demo</pre><p>path是你注销路由的名称。将其设置为logout-同样我们需要创建这样一个路由。target是当用户退出后重定向页面的。我们把target设置为_demo路由,后面我们会调整它：</p><pre class="crayon-plain-tag"># app/config/security.yml
# ...
firewalls:
    secured_area:
        # ...
        logout:
            path:   logout # a route called logout
            target: _demo  # a route called event</pre><p>下面来添加logout路由。在SecurityController里创建方法并使用@Route annotation：</p><pre class="crayon-plain-tag">// ...
// src/Yoda/UserBundle/Controller/SecurityController.php

/**
 * @Route("/logout", name="logout")
 */
public function logoutAction()
{
}</pre><p>就像loginCheckAction一样这里的代码不会实际运行。symfony会拦截请求，并为我们处理注销操作。尝试访问 /logout。太好了！你可以看到debug工具栏又变成了匿名用户。</p>
<p>&nbsp;</p>
<h2>整理loginAction</h2>
<p>如果我们登录失败会看到一个“Bad Credentials”消息。Symfony处理登录时,这个错误会保存到session的一个特殊键里,而我们只是在loginAction抓取出来。</p>
<p>删除if语句，只留下两个部分：</p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/Controller/SecurityController.php
// ...

public function loginAction(Request $request)
{
    $session = $request-&gt;getSession();

    // get the login error if there is one
    $error = $session-&gt;get(SecurityContextInterface::AUTHENTICATION_ERROR);
    $session-&gt;remove(SecurityContextInterface::AUTHENTICATION_ERROR);

    return array(
        // last username entered by the user
        'last_username' =&gt; $session-&gt;get(SecurityContextInterface::LAST_USERNAME),
        'error'         =&gt; $error,
    );
}</pre><p></p>
<blockquote><p>如果使用use_forward,那么symfony会转发到login页面而不是重定向。</p></blockquote>
<p>&nbsp;</p>
<h2>添加一个css</h2>
<p>我知道登录页面很丑，所以我做了一个login.css文件来解决。</p>
<p>让我们创建它到UserBundle下的Resources/public/css目录：</p><pre class="crayon-plain-tag">/* src/Yoda/UserBundle/Resources/public/css/login.css */
.login {
    width: 500px;
    margin: 100px auto;
}

/* for the rest of login.css, see the code download */</pre><p>运行 app/console assets:install 并添加 &#8211;symlink配置</p><pre class="crayon-plain-tag">php app/console assets:install --symlink</pre><p>symfony会将src/Yoda/UserBundle/Resources/public目录下的文件创建到web/bundles/user中去。这个web/就是你应用程序的根目录，使得浏览器可以访问到我们新的/bundles/user/css/login.css。</p>
<p>那我们怎么才能添加这个css到我们的页面呢？首先，打开base模板。在这里我们有一群blocks，其中有一个stylesheets块，我们可以把全局的css文件放到这里面：</p><pre class="crayon-plain-tag"># 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'
    %}
        &lt;link rel="stylesheet" href="{{ asset_url }}" /&gt;
    {% endstylesheets %}
{% endblock %}</pre><p>你发现我们不存在此EventBundle，所以我们要创建一个EventBundle。输入命令php app/console generate:bundle  &#8211;namespace=Yoda/EventBundle</p>
<p>创建完成后，将<span style="color: #ff0000">public.rar</span>里面的css和img文件夹拷贝到src/Yoda/EventBundle/Resources/public目录下。</p>
<p>再次运行</p><pre class="crayon-plain-tag">php app/console assets:install --symlink</pre><p>样式文件已经全部存在了。</p>
<p>让我们来看看继承他的login.html.twig文件并把login.css添加到页面：</p><pre class="crayon-plain-tag">{# src/Yoda/UserBundle/Resources/views/Security/login.html.twig #}

{% block stylesheets %}
    &lt;link rel="stylesheet" href="{{ asset('bundles/user/css/login.css') }}" /&gt;
{% endblock %}</pre><p>很棒，等等你会看到一些问题？它覆盖了之前base.html.twig的样式，但是我们不想这样。有一个秘诀就是使用twig的parent()函数。通过这样的方式父类块里的内容也被包入进来了：</p><pre class="crayon-plain-tag">{# src/Yoda/UserBundle/Resources/views/Security/login.html.twig #}

{% block stylesheets %}
    {{ parent() }}

    &lt;link rel="stylesheet" href="{{ asset('bundles/user/css/login.css') }}" /&gt;
{% endblock %}</pre><p>现在你刷新。好看一点了，所以说当你要添加css或者js到一个页面那么你就这样做。</p>
<p>我们还需呀加入少许的错误class，让它看起来更好些：</p><pre class="crayon-plain-tag">{# src/Yoda/UserBundle/Resources/views/Security/login.html.twig #}
{# ... #}

{% if error %}
    &lt;div class="error"&gt;{{ error.message }}&lt;/div&gt;
{% endif %}</pre><p>下面我们要做的事情会让页面看起来更好，让我们打开base.html.twig，添加bootstrap的css文件：</p><pre class="crayon-plain-tag">{# app/Resources/views/base.html.twig #}
{# ... #}

{% block stylesheets %}
    &lt;link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"/&gt;

    ...
{% block stylesheets %}</pre><p>返回login.html.twig,调整一下提交按钮：</p><pre class="crayon-plain-tag">{# src/Yoda/UserBundle/Resources/views/Security/login.html.twig #}
{# ... #}

&lt;hr/&gt;
&lt;button type="submit" class="btn btn-primary pull-right"&gt;login&lt;/button&gt;</pre><p>刷新好多了！虽然我不是美工，但是我希望他好看些！</p>
<p>&nbsp;</p>
<p>翻译这些错误的登录信息</p>
<p>在这里我们看到的“Bad Credentials”消息提示，太有程序员的味道了，因为这个消息来自于symfony核心。所以我们要使用翻译来自定义它。</p>
<p>首先使用Twig trans 过滤这个消息：</p><pre class="crayon-plain-tag">{# src/Yoda/UserBundle/Resources/views/Security/login.html.twig #}
{# ... #}

{% if error %}
    &lt;div class="error"&gt;{{ error.message|trans }}&lt;/div&gt;
{% endif %}</pre><p>接下来，我们创建一个translation文件在app/Resources/translations/messages.en.yml目录中。这个文件中仅仅是简单的键值对：</p><pre class="crayon-plain-tag"># app/Resources/translations/messages.en.yml
Bad credentials. : 兄弟你的用户名或密码错误!</pre><p>现在，我只需要在app/config.yml文件中激活它就可以了</p><pre class="crayon-plain-tag">framework:
    # ...
    translator:      { fallbacks: ["%locale%"] }</pre><p>现在好了，试试吧！</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/symfony/archives/409">KU案例2之05注销和整理</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/symfony">Symfony中文教程</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.newlifeclan.com/symfony/archives/409/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
