php-Symfony#[CurrentUser]属性は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());
}
SayのCall to a member function getFirstName() on null
しかし、私は許可されています。 Symfony Profilerで、私がログインしていることが表示されます。
環境:PHP 8.0.11 Symfony 5.3.9
答え :
解決:
ソリューションの正しい詳細はhttps://stackoverflow.com/users/1144627/will-b によって提供されますSymfony#[CurrentUser]属性はnullを返します
この問題は、有効なParamConvertor
(sensio/framework-extra-bundle
)が原因で発生します。 DBからエンティティをフェッチする方法の定義が不足しているため、ユーザーを解決できません。そのため、nullが可能な#[CurrentUser] ?User $user
null
に設定します。パラメータコンバーターと#[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%のブラウザスケールでドキュメントを読んでください。
答え :
解決:
コントローラが「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()); }
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。