Symfony 2:HWiOauthBundle:覆盖 connect_success.html.twig
Symfony 2 : HWiOauthBundle : Overriding connect_success.html.twig
我在我的 Symfony 2 项目中实现了 FOSUserBundle 和 HWIOauthBundle。基本上,一切正常,但我想定制更多。通常我使用 HWIOauthBundle 的 connect 功能将 oauth 帐户连接到已经连接到身份验证表单 (FOSUserBundle) 的用户。
如果成功,控制器操作 HWIOAuthBundle:Connect:connectService 显示 twig 模板 connect_success.html.twig。此时,我想覆盖此模板并执行以下操作:
- 创建即显消息
- 在我的主页上显示即显信息
您可以使用 FOSUserBundle 轻松获得此行为,因为此捆绑包会分派许多事件以挂接到控制器。但是使用 HWIOauthBundle 这是不可能的。
我的解决方案如下:
1/ 我通过在 app/Ressources/HWIOauthBundle/views/Connect 中放置相同的命名文件来覆盖 connect_success.html.twig,代码如下:
{{ render(controller('MyUserBundle:User:HWIOAuthFlash')) }}
2/ 在我的用户控制器 (MyUserBundle:User) 中,我创建了一个动作 HWIOAuthFlashAction() 来定义一个闪现消息和转发到显示主页的控制器操作(MyMainBundle:Main:homepage)
public function HWIOAuthFlashAction()
{
// Here : flash message definition
return $this->forward('MyMainBundle:Main:homepage');
}
此时主页显示闪现消息。但是我不得不删除主页模板中的两个链接 (homepage.twig.html),这两个链接允许用户在两个语言环境之间切换。
以下代码是我必须从模板中删除的代码:
<ul>
<li><a href="{{ path( app.request.get('_route'), app.request.get( '_route_params')|merge({'_locale': 'fr'} )) }}">FR</a></li>
<li><a href="{{ path( app.request.get('_route'), app.request.get( '_route_params')|merge({'_locale': 'en'} )) }}">EN</a></li>
</ul>
我了解到特殊变量 _route 为空。我收到以下消息:
An exception has been thrown during the rendering of a template
("Error when rendering
"xxxxx/web/app_dev.php/connect/service/google?key=yyyyyyy" (Status
code is 500).") in HWIOAuthBundle:Connect:connect_success.html.twig at
line 3.
我有两个问题:
- 实现我的目标,是不是好方法?
- 如何对 symfony 说我希望我的路由是 主页 ?
正如我在评论中提出的那样,这是我的解决方案:
在我的主页模板中 homepage.twig.html :
{% set route = app.request.get('_route') ? app.request.get('_route') : 'homepage' %}
<ul>
<li><a href="{{ path(route, app.request.get( '_route_params')|merge({'_locale': 'fr'} )) }}">FR</a></li>
<li><a href="{{ path(route, app.request.get( '_route_params')|merge({'_locale': 'en'} )) }}">EN</a></li>
</ul>
我在我的 Symfony 2 项目中实现了 FOSUserBundle 和 HWIOauthBundle。基本上,一切正常,但我想定制更多。通常我使用 HWIOauthBundle 的 connect 功能将 oauth 帐户连接到已经连接到身份验证表单 (FOSUserBundle) 的用户。
如果成功,控制器操作 HWIOAuthBundle:Connect:connectService 显示 twig 模板 connect_success.html.twig。此时,我想覆盖此模板并执行以下操作:
- 创建即显消息
- 在我的主页上显示即显信息
您可以使用 FOSUserBundle 轻松获得此行为,因为此捆绑包会分派许多事件以挂接到控制器。但是使用 HWIOauthBundle 这是不可能的。
我的解决方案如下:
1/ 我通过在 app/Ressources/HWIOauthBundle/views/Connect 中放置相同的命名文件来覆盖 connect_success.html.twig,代码如下:
{{ render(controller('MyUserBundle:User:HWIOAuthFlash')) }}
2/ 在我的用户控制器 (MyUserBundle:User) 中,我创建了一个动作 HWIOAuthFlashAction() 来定义一个闪现消息和转发到显示主页的控制器操作(MyMainBundle:Main:homepage)
public function HWIOAuthFlashAction()
{
// Here : flash message definition
return $this->forward('MyMainBundle:Main:homepage');
}
此时主页显示闪现消息。但是我不得不删除主页模板中的两个链接 (homepage.twig.html),这两个链接允许用户在两个语言环境之间切换。
以下代码是我必须从模板中删除的代码:
<ul>
<li><a href="{{ path( app.request.get('_route'), app.request.get( '_route_params')|merge({'_locale': 'fr'} )) }}">FR</a></li>
<li><a href="{{ path( app.request.get('_route'), app.request.get( '_route_params')|merge({'_locale': 'en'} )) }}">EN</a></li>
</ul>
我了解到特殊变量 _route 为空。我收到以下消息:
An exception has been thrown during the rendering of a template ("Error when rendering "xxxxx/web/app_dev.php/connect/service/google?key=yyyyyyy" (Status code is 500).") in HWIOAuthBundle:Connect:connect_success.html.twig at line 3.
我有两个问题:
- 实现我的目标,是不是好方法?
- 如何对 symfony 说我希望我的路由是 主页 ?
正如我在评论中提出的那样,这是我的解决方案:
在我的主页模板中 homepage.twig.html :
{% set route = app.request.get('_route') ? app.request.get('_route') : 'homepage' %}
<ul>
<li><a href="{{ path(route, app.request.get( '_route_params')|merge({'_locale': 'fr'} )) }}">FR</a></li>
<li><a href="{{ path(route, app.request.get( '_route_params')|merge({'_locale': 'en'} )) }}">EN</a></li>
</ul>