Symfony #[CurrentUser] 属性 returns 空
Symfony #[CurrentUser] attribute returns null
<?php
declare(strict_types=1);
namespace App\Controller\User;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser;
#[Route('/users', name: 'user.')]
class UserController extends AbstractController
{
#[Route(name: 'list')]
public function list(#[CurrentUser] ?User $user, Request $request): Response {
dd($user->getFirstName());
}
说的
Call to a member function getFirstName() on null
但我已获得授权。在 Symfony Profiler 中,它显示我已登录。
环境:
PHP8.0.11
交响乐 5.3.9
如果你的控制器扩展了“AbstractController”
您可以使用 $this->getUser()
获取当前用户。
在你的列表函数中你既没有给用户 ID 也没有给 $user 所以 $user 是合理的 null
#[Route('/users', name: 'user.')]
class UserController extends AbstractController
{
#[Route(name: 'list')]
public function list( Request
$request): Response {
dd($this->getUser()->getFirstName());
}
解决方案的正确细节由 https://whosebug.com/users/1144627/will-b 提供
此问题是由启用的 ParamConvertor
(sensio/framework-extra-bundle
) 引起的。
由于缺少如何从数据库中获取实体的定义,它无法解析用户,因此它将 $user 变量设置为 null
因为可为空 #[CurrentUser] ?User $user
。
如果您想同时保留参数转换器和#[CurrentUser] 属性的功能,您应该禁用自动转换#
config/packages/sensio_framework_extra.yaml
sensio_framework_extra:
request:
converters: true
auto_convert: false
并且每次都手动定义路由参数。
资料来源:
https://symfony.com/bundles/SensioFrameworkExtraBundle/current/annotations/converters.html
https://symfony.com/blog/new-in-symfony-5-2-controller-argument-attributes
https://symfony.com/doc/current/controller/argument_value_resolver.html
避免此类问题的解决方案:以 200% 的浏览器比例阅读文档。
<?php
declare(strict_types=1);
namespace App\Controller\User;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser;
#[Route('/users', name: 'user.')]
class UserController extends AbstractController
{
#[Route(name: 'list')]
public function list(#[CurrentUser] ?User $user, Request $request): Response {
dd($user->getFirstName());
}
说的
Call to a member function getFirstName() on null
但我已获得授权。在 Symfony Profiler 中,它显示我已登录。
环境: PHP8.0.11 交响乐 5.3.9
如果你的控制器扩展了“AbstractController”
您可以使用 $this->getUser()
获取当前用户。
在你的列表函数中你既没有给用户 ID 也没有给 $user 所以 $user 是合理的 null
#[Route('/users', name: 'user.')]
class UserController extends AbstractController
{
#[Route(name: 'list')]
public function list( Request
$request): Response {
dd($this->getUser()->getFirstName());
}
解决方案的正确细节由 https://whosebug.com/users/1144627/will-b 提供
此问题是由启用的 ParamConvertor
(sensio/framework-extra-bundle
) 引起的。
由于缺少如何从数据库中获取实体的定义,它无法解析用户,因此它将 $user 变量设置为 null
因为可为空 #[CurrentUser] ?User $user
。
如果您想同时保留参数转换器和#[CurrentUser] 属性的功能,您应该禁用自动转换#
config/packages/sensio_framework_extra.yaml
sensio_framework_extra:
request:
converters: true
auto_convert: false
并且每次都手动定义路由参数。 资料来源: https://symfony.com/bundles/SensioFrameworkExtraBundle/current/annotations/converters.html https://symfony.com/blog/new-in-symfony-5-2-controller-argument-attributes https://symfony.com/doc/current/controller/argument_value_resolver.html
避免此类问题的解决方案:以 200% 的浏览器比例阅读文档。