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

Detect Symfony's internal subrequests in a twig view

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

为此,我使用内部子请求集成了 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 以删除它们的 "extends" 并且什么都不放(因为布局是在父视图中定义的)。

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

为了实现这一点并在需要时使用我的基本布局,我做了一个丑陋的把戏 register.html.twig:

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

有没有更好的方法来检测我们是否在子请求中?我在请求中寻找类似 "hasParent" 的东西,但没有找到任何东西。

我需要的东西与您尝试做的类似,最终使用了 EL,因此您可以创建一个事件侦听器来检查当前请求是主请求还是子请求,然后根据需要使用它。完整示例是 here and here.

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';

        //......
    }
}