在树枝视图中检测Symfony的内部子请求

时间:2015-07-19 10:43:33

标签: php symfony twig fosuserbundle

我想在同一页面中整合FOSUserBundle的注册表和登录表单:

enter image description here

为此,我使用内部子请求集成了2个表单:

<div class="col-md-6">
    {{ render(controller('FOSUserBundle:Security:login')) }}
</div>

<div class="col-md-6">
    {{ render(controller('FOSUserBundle:Registration:register', {'parent': true})) }}
</div>

需要修改FOSUserBundle:Registration:register.html.twig以删除他们的&#34;扩展&#34;并且不做任何改为(因为布局是在父视图中定义的)。

但是当访问/register路由时(例如,当用户注册成功时),我需要扩展我的基本布局,以正确呈现注册确认视图。

enter image description here

为了达到这个目的并在需要时使用我的基本布局,我在register.html.twig中做了一个超级技巧:

{% 
    extends app.request.pathInfo == '/_fragment'
        ? "FOSUserBundle::empty.html.twig"
        : "FOSUserBundle::layout.html.twig" 
%}

有没有更好的方法来检测我们是否处于子请求中?我找了像&#34; hasParent&#34;在请求中,但没有找到任何东西。

1 个答案:

答案 0 :(得分:2)

我需要类似于您尝试做的事情并最终使用EL,因此您可以创建一个事件监听器来检查当前请求是主服务器还是子服务器然后根据需要使用它。完整的示例是herehere

EL可以是onKernelController或onKernelRequest。如果您很乐意将变量传递给控制器​​中的twig,那么请使用onKernelController,这是我出于类似原因使用的。

<强> services.yml

services:
    application_backend.listener.user_controller:
        class: Application\BackendBundle\EventListener\UserControllerListener
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

事件监听器(onKernelRequest)

namespace Application\BackendBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class UserControllerListener
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        $req = $event->isMasterRequest() ? 'Master' : 'Sub';
        $req = $event->getRequestType() ? 'Master' : 'Sub';

        //......
    }
}