Symfony - Twig 模板中的服务
Symfony - Service in Twig template
我用 Symfony 3.4 制作了我的网站,并开发了我自己的用户管理包。更具体地说,该包包含 2 个实体:用户和组。下面是它和一些getters/setters:
之间的ManyToMany关系
<?php
class User
{
/**
* @ORM\ManyToOne(targetEntity="Group")
*/
private $groups;
public function addGroup(Group $group)
{
//
}
public function removeGroup(Group $group)
{
//
}
public function getGroup()
{
//
}
和
<?php
class Group
{
/**
* @ORM\ManyToOne(targetEntity="User")
*/
private $users;
很简单。一切正常,例如:
- 用户 "carlos" 获得第 1 组和第 2 组
- 用户 "peter" 获得组 #3
我不能做的是在我的 twig 模板中向特定组的所有用户显示特定文本。
我尝试了什么:
- 正在我的包中创建新服务,然后检索当前用户。完成。
- 获取当前用户的组列表。我被困在这里了。
- 在 twig 中注入服务,然后使用 {%if}{%endif} 语句。完成(已测试)。
下面是我的定制服务:
<?php
namespace CoreBundle\Security;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class AuthorizationChecker
{
private $tokenStorage;
public function __construct(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
/**
*
* Get current user's groups
* @return array
*
*/
public function getUserGroups()
{
$user = $this->tokenStorage->getToken()->getUser();
// I can var_dump($user) in Twig
// But don't know how to get his group(s).
}
}
我成功获取了当前用户,但我不知道如何获取他所属的组。
任何的想法 ?有没有更好的方法来实现这一切?
不确定您是否可以获取用户所在的组。我可以肯定的是,你可以在 twig.
中使用 {% if is_granted('ROLE_WHATEVER') %}
所以一个组是角色的集合...也许您可以直接检查角色...希望对您有用。抱歉,如果没有帮助。
您可以直接在 twig 模板中访问登录的用户数据,而无需在控制器中请求任何内容。可以像这样访问用户:app.user
.
我会向您的 User
对象添加一个方法 hasGroup
然后您可以在您的 twig 模板中调用该方法来测试用户是否属于某个组。
如果你这样做了,那么你可以这样做:
{% if app.user.hasGroup('groupName') %}
//do something
{% endif %}
如果用户可能有多个组,并且同一个组可能属于多个用户 - 这是典型的多对多关系。
- 我看到 两个 ManyTo一个。如果不是这个注释的拼写错误
你会在
users
table AND user_id
中得到 group_id
您的 groups
table 这不是多对多模型。看一看
在这个 http://ormcheatsheet.com/#manytomany and especialy this => https://gist.github.com/Ocramius/3121916
- 检查什么
$user->getGroup()
returns。如果它 returns 是一个组(Group
的单个对象)而不是 ArrayCollection
-> 该关系不会像您描述的那样工作,并且您不会获得已分配组的列表。
- 经常检查你与
bin/console doctrine:schema:validate
的关系
P.S。如果你 运行 bin/console doctrine:generate:entity YourBundleName:Group
你会得到一个错误
"Group" is a reserved word
所以我假设您已经手动创建了所有实体。仔细检查是否有错字或错误 copy/paste
我用 Symfony 3.4 制作了我的网站,并开发了我自己的用户管理包。更具体地说,该包包含 2 个实体:用户和组。下面是它和一些getters/setters:
之间的ManyToMany关系<?php
class User
{
/**
* @ORM\ManyToOne(targetEntity="Group")
*/
private $groups;
public function addGroup(Group $group)
{
//
}
public function removeGroup(Group $group)
{
//
}
public function getGroup()
{
//
}
和
<?php
class Group
{
/**
* @ORM\ManyToOne(targetEntity="User")
*/
private $users;
很简单。一切正常,例如:
- 用户 "carlos" 获得第 1 组和第 2 组
- 用户 "peter" 获得组 #3
我不能做的是在我的 twig 模板中向特定组的所有用户显示特定文本。 我尝试了什么:
- 正在我的包中创建新服务,然后检索当前用户。完成。
- 获取当前用户的组列表。我被困在这里了。
- 在 twig 中注入服务,然后使用 {%if}{%endif} 语句。完成(已测试)。
下面是我的定制服务:
<?php
namespace CoreBundle\Security;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class AuthorizationChecker
{
private $tokenStorage;
public function __construct(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
/**
*
* Get current user's groups
* @return array
*
*/
public function getUserGroups()
{
$user = $this->tokenStorage->getToken()->getUser();
// I can var_dump($user) in Twig
// But don't know how to get his group(s).
}
}
我成功获取了当前用户,但我不知道如何获取他所属的组。 任何的想法 ?有没有更好的方法来实现这一切?
不确定您是否可以获取用户所在的组。我可以肯定的是,你可以在 twig.
中使用{% if is_granted('ROLE_WHATEVER') %}
所以一个组是角色的集合...也许您可以直接检查角色...希望对您有用。抱歉,如果没有帮助。
您可以直接在 twig 模板中访问登录的用户数据,而无需在控制器中请求任何内容。可以像这样访问用户:app.user
.
我会向您的 User
对象添加一个方法 hasGroup
然后您可以在您的 twig 模板中调用该方法来测试用户是否属于某个组。
如果你这样做了,那么你可以这样做:
{% if app.user.hasGroup('groupName') %}
//do something
{% endif %}
如果用户可能有多个组,并且同一个组可能属于多个用户 - 这是典型的多对多关系。
- 我看到 两个 ManyTo一个。如果不是这个注释的拼写错误
你会在
users
table ANDuser_id
中得到group_id
您的groups
table 这不是多对多模型。看一看 在这个 http://ormcheatsheet.com/#manytomany and especialy this => https://gist.github.com/Ocramius/3121916 - 检查什么
$user->getGroup()
returns。如果它 returns 是一个组(Group
的单个对象)而不是ArrayCollection
-> 该关系不会像您描述的那样工作,并且您不会获得已分配组的列表。 - 经常检查你与
bin/console doctrine:schema:validate
的关系
P.S。如果你 运行 bin/console doctrine:generate:entity YourBundleName:Group
你会得到一个错误
"Group" is a reserved word
所以我假设您已经手动创建了所有实体。仔细检查是否有错字或错误 copy/paste