4

我正在尝试在我的项目中创建 3 个用户:

  • Cliente:谁将访问前端并具有“名称”、“CPF”、“地址”字段。
  • 供应商:谁将在网站上注册优惠并拥有“电话”、“CNPJ”字段
  • 管理员:谁将管理所有客户、供应商、报价等...

所以.. 我为此安装了 3 个包:SonataUserBundle + FosUserBundle + SonataAdminBundle 我按照每个包的整个教程进行操作。但我不知道如何创建这种用户的每种类型。

我正在使用 ApplicationSonataUserBundle 生成实体用户和组。

这是我的代码:

namespace Sete\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Application\Sonata\UserBundle\Entity\User as BaseUser;

/**
 * Cliente
 *
 * @ORM\Table(name="cliente")
 * @ORM\Entity
 * 
 */
class Cliente extends BaseUser
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    ...another fields...
}

和供应商:

namespace Sete\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Application\Sonata\UserBundle\Entity\User as BaseUser;

/**
 * Vendedor
 *
 * @ORM\Table(name="vendedor")
 * @ORM\Entity
 */
class Vendedor extends BaseUser
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    ...another fields...
}

应用内核.php

        ...
        new Sonata\UserBundle\SonataUserBundle('FOSUserBundle'),
        new Sonata\EasyExtendsBundle\SonataEasyExtendsBundle(),
        new Application\Sonata\UserBundle\ApplicationSonataUserBundle()

和 config.yml

...
fos_user:
    db_driver:      orm # can be orm or odm
    firewall_name:  main
    user_class:     Application\Sonata\UserBundle\Entity\User
    group:
        group_class: Application\Sonata\UserBundle\Entity\Group

sonata_user:
manager_type: orm # can be orm or mongodb
...

这样,我的实体 Cliente 和 Vendor 与组没有关联。我尝试添加 $groups 关系,但不起作用。所以,当我尝试管理这个实体时,我得到了错误:

执行 'SELECT count(DISTINCT c0_.id) AS sclr0 FROM cliente c0_ LEFT JOIN fos_user_user_group f3_ ON f2_.id = f3_.user_id LEFT JOIN fos_user_group f1_ ON f1_.id = f3_.group_id' 时发生异常:

SQLSTATE [42S22]:找不到列:1054 'on 子句'中的未知列 'f2_.id'

这是创建用户类型的最佳实践吗?或者,不是扩展 ApplicationUserBundle:User,而是创建 Cliente 和 Vendor 实体(不扩展 ApplicationUserBundle:User),然后创建与 User 的关系(将字段 $cliente 和 $vendor 放入 User 实体并建立关系)?

对不起英语。我整个星期都在尝试这样做。遵循许多教程,但没有得到答案。

谢谢大家。

4

1 回答 1

1

拥有多个用户类型的一种方法是使用 Doctrine继承映射

但是,我建议将单一用户类型与角色安全处理程序一起使用。您应该使用 Easy Extends(安装说明)安装 SonataUserBundle,这样您就可以不修改 SonataUserBundle。您应该将所有需要的字段添加到 App\UserBundle\Entity\User 并创建三个用户组:客户、供应商和管理员。在您的主 config.yml 中,添加两个缺少的角色(已经有 ROLE_ADMIN):

ROLE_SUPER_ADMIN:       [<...>, ROLE_CLIENT, ROLE_VENDOR]

为这三个用户组分配您创建的适当权限。

现在,在用户中,使自定义字段可为空,并且在您的 UserAdmin 中仅显示字段用户类型可以使用安全权限看到。例子:

if ($this->isGranted('ROLE_CLIENT')) {
    $formMapper->add('cpf');
}
于 2013-07-07T09:27:19.440 回答