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;

很简单。一切正常,例如:

我不能做的是在我的 twig 模板中向特定组的所有用户显示特定文本。 我尝试了什么:

    1. 正在我的包中创建新服务,然后检索当前用户。完成。
    1. 获取当前用户的组列表。我被困在这里了。
    1. 在 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 %}

如果用户可能有多个组,并且同一个组可能属于多个用户 - 这是典型的多对多关系。

  1. 我看到 两个 ManyTo一个。如果不是这个注释的拼写错误 你会在 users table AND user_id 中得到 group_id 您的 groups table 这不是多对多模型。看一看 在这个 http://ormcheatsheet.com/#manytomany and especialy this => https://gist.github.com/Ocramius/3121916
  2. 检查什么 $user->getGroup() returns。如果它 returns 是一个组(Group 的单个对象)而不是 ArrayCollection -> 该关系不会像您描述的那样工作,并且您不会获得已分配组的列表。
  3. 经常检查你与bin/console doctrine:schema:validate
  4. 的关系

P.S。如果你 运行 bin/console doctrine:generate:entity YourBundleName:Group 你会得到一个错误

"Group" is a reserved word

所以我假设您已经手动创建了所有实体。仔细检查是否有错字或错误 copy/paste