我的symfony项目设置得很整齐,但是我一直在努力解决这一问题。
我有一个App/Entity/User
类,用于填充数据库中的用户信息
class User implements AdvancedUserInterface, \Serializable
{
public function __construct()
{
$this->forumPermission = new ArrayCollection();
$this->activities = new ArrayCollection();
}
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(
* type="string",
* name="salt",
* length=32
* )
*/
private $salt = "";
/**
* @ORM\Column(
* type="string",
* length=75,
* name="user_name"
* )
* @Assert\NotBlank(
* message="De gebruikersnaam moet ingevuld zijn"
* )
*/
private $username;
// ...
}
并在security.yaml中正确链接
security:
# https://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
providers:
db_provider:
entity:
class: App\Entity\User
property: username
但是,如果用户未登录,则将其视为匿名用户。
我发现方便的是,匿名用户将拥有其自己的User实例,而使用$this->getUser() === null
。
我知道为什么,但是我很固执:
我有一个基本控制器,该控制器是从所有其他控制器继承的:
abstract class BaseController extends Controller
{
protected $logger = null;
protected $globals = null;
protected $translator = null;
protected $security = null;
/* @var $currentUser User */
protected $currentUser = null;
public function __construct(
Globals $globals,
LoggerInterface $logger,
TranslatorInterface $translator,
Security $security
) {
$this->logger = $logger;
$this->globals = $globals;
$this->translator = $translator;
$this->currentUser = $security->getUser();
}
protected function getUser() {
if (!$this->currentUser instanceof User) {
/* @var $anonForumPerm ForumPermission */
$anonForumPerm = $this->getDoctrine()->getRepository(ForumPermission::class)->find(5);
$this->currentUser = new User();
$this->currentUser->setName('Anonymous')
->setSurname('User')
->setUsername('anon.')
->setForumPermission($anonForumPerm)
;
}
return $this->currentUser;
}
// ...
}
这似乎可行,但是我现在唯一的问题是树枝的app.user
,它仍然为空。
有没有办法将$this->currentUser
推到树枝上的app.user
?
还是有更好的方式来处理匿名用户?
我的理论是,无论用户是否尚未登录,我都希望能够在app.user
或IS_AUTHENTICATED_FULLY
之间进行选择。
一些额外的输入将不胜感激
答案 0 :(得分:0)
我之前也曾为这个问题而苦苦挣扎,这是我的经验中的一些补充意见。
如果您的网站访问者未登录,Symfony会给他AnonymousToken
,可通过{{ app.token.user }}
在树枝中获取该anon.
,它返回字符串{{ app.user }}
另一种方法是只检查null
是否不是<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false" />
</android.support.v4.widget.NestedScrollView>
。