gpt4 book ai didi

symfony - 加载 Web 调试工具栏时出错

转载 作者:行者123 更新时间:2023-12-02 01:02:04 25 4
gpt4 key购买 nike

我正在 Symfony 3.4 项目中工作,并且一直面临一个奇怪的问题。 Web 调试工具栏无法加载,而是显示错误“加载 Web 调试工具栏时发生错误。打开 Web 分析器。”这是屏幕截图
enter image description here

当我点击 Open the web profiler 链接时,它会将我带到另一个异常(exception)页面。这是它的截图

enter image description here

因此,经过数小时的调试后,我发现问题出在
自定义监听器。它在我的 services.yml 中注册如下:

services:
language.kernel_request_listener:
class: TraceBundle\Listeners\LanguageListener
arguments:
- "@service_container"
tags:
- { name: kernel.event_listener, event: kernel.request, method: setLocale }

这是 LanguageListener.php:
<?php

namespace TraceBundle\Listeners;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;


class LanguageListener{

private $token_storage;

private $securityContext;

private $container;

public function __construct(ContainerInterface $containerInterface)
{
$this->container = $containerInterface;
$this->securityContext = $this->container->get('security.authorization_checker');
$this->token_storage = $this->container->get('security.token_storage');
}

public function setLocale(GetResponseEvent $event)
{


if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}

if ($this->securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
$user = $this->token_storage->getToken()->getUser();
$userLocale = $user->getTenant()->getLanguage()->getValue();
$tenantid = $this->container->get('tenant_manager')->getTenantId($user);
$request = $event->getRequest();
$request->attributes->set('tenantid', $tenantid);
if ($userLocale) {
$request->setLocale($userLocale);
$translator = $this->container->get('translator');
$translator->setLocale($userLocale);
}
}
}
}

现在,当我评论以下几行时:
if ($this->securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
$user = $this->token_storage->getToken()->getUser();
$userLocale = $user->getTenant()->getLanguage()->getValue();
$tenantid = $this->container->get('tenant_manager')->getTenantId($user);
$request = $event->getRequest();
$request->attributes->set('tenantid', $tenantid);
if ($userLocale) {
$request->setLocale($userLocale);
$translator = $this->container->get('translator');
$translator->setLocale($userLocale);
}

错误消失,分析器按预期加载。

我试过 var_dump()在每一行之后,所有值似乎都很好。服务tenant_manager 和翻译服务都可以正常工作。我在这里缺少什么?如果您需要更多代码,请告诉我。

提前致谢!

编辑:根据这里的要求是我的 security.yml:
security:

# https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
providers:
in_memory:
memory: ~
fos_userbundle:
id: fos_user.user_provider.username

firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
form_login:
success_handler: authentication.handler.login_success_handler
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager

# logout: true
logout:
path: /logout
target: /login

anonymous: true

js_router:
pattern: ^/(js\/routing)
security: false

encoders:
FOS\UserBundle\Model\UserInterface: bcrypt

role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN


access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/dashboard, role: ROLE_ADMIN }
- { path: ^/campaigns, role: ROLE_ADMIN }
- { path: ^/dashboard, role: ROLE_ADMIN }
- { path: ^/lives, role: ROLE_ADMIN }
- { path: ^/colleagues, role: ROLE_ADMIN }
- { path: ^/addcolleague, role: ROLE_ADMIN }
- { path: ^/adminpage, role: ROLE_ADMIN }
- { path: ^/test, role: ROLE_ADMIN }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }

最佳答案

我在使用带有 TokenStorageInterface 的自定义监听器时遇到了完全相同的问题。

这是我的监听器代码的缩小版本:

class DatabaseUserAuthenticationListener {
private $authToken;

public function __construct(TokenStorageInterface $tokenStorage) {
if ($tokenStorage->getToken()) {
$this->authToken = $tokenStorage->getToken();
}
}

public function onKernelController(FilterControllerEvent $event) {
if ($this->authToken) {
$this->authToken->setAttribute("blah", true);
}
}
}

就我而言,违规行是 $this->authToken->setAttribute("blah", true); . $this->authToken最终是 null_wdt路由被调用(因为它们没有用户上下文)。至少这是我的理论。

@Pavel 是正确的,因为 Symfony 在请求之间将 token 设置为 null,尽管我认为它不是 security: false就是这样做的。

在使用它之前检查您的 token 是否存在并且不为空或空( if ($this->authToken) {...} )解决了问题(至少对我而言)。

@utkarsh2k2,我确定你已经解决了你的问题......如果没有,你可以尝试检查 $this->token_storage->getToken()打电话之前里面有东西 ->getUser() .

关于symfony - 加载 Web 调试工具栏时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49923737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com