Symfony-Twig模板中的服务

时间:2018-08-21 15:55:31

标签: symfony symfony-3.4

我使用Symfony 3.4创建了我的网站,并开发了自己的用户管理包。更具体地说,捆绑包包含2个实体:用户和组。下面是它与一些获取器/设置器之间的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

我不能做的是在树枝模板中向特定组的所有用户显示特定文本。 我尝试过的:

    1. 在我的捆绑包中创建一个新服务,然后检索当前用户。完成。
    1. 获取当前用户组的列表。我在这里卡住。
    1. 将服务插入树枝,然后使用{%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).
    }

}

我设法获得了当前用户,但是我不知道如何获得他所属的组。 任何想法 ?有没有更好的方法来实现所有这些目的?

3 个答案:

答案 0 :(得分:2)

您可以直接在树枝模板中访问已登录的用户数据,而无需在控制器中请求任何内容。可以这样访问用户:app.user

我会向您的hasGroup对象添加方法User,然后您可以在树枝模板中调用该方法以测试用户是否属于组。

如果您这样做了,那么您就可以这样做:

{% if app.user.hasGroup('groupName') %} 
     //do something 
{% endif %}

答案 1 :(得分:1)

不确定是否可以获取具有该用户的组。我肯定知道的是,您可以在树枝内部使用{% if is_granted('ROLE_WHATEVER') %}

因此,一个小组是角色的集合...也许您可以检查角色的直率...希望对您有用。抱歉,如果没有帮助。

答案 2 :(得分:-1)

如果用户可能有多个组,而同一组可能属于多个用户-这是经典的ManyToMany Relation。

  1. 我看到两个 ManyTo 一个。如果不是带有此注释的错字 您将在group_id表{strong> AND users中获得user_id 您的groups表不是多对多模型。看一看 在此http://ormcheatsheet.com/#manytomany,尤其是在此=> https://gist.github.com/Ocramius/3121916
  2. 检查$user->getGroup()返回什么。如果它返回一个组(Group的单个对象)而不是ArrayCollection->该关系将无法按照您所描述的那样工作,并且您将无法获得已分配组的列表。
  3. 始终检查与bin/console doctrine:schema:validate的关系

P.S。如果您运行bin/console doctrine:generate:entity YourBundleName:Group,将会收到错误消息

  

“组”是保留字

因此,我假设您已手动创建了所有实体。仔细检查是否有错字或错误的复制/粘贴