用户类型SonataUserBundle + FOSUserBundle + SonataAdminBundle

时间:2013-07-06 20:51:03

标签: symfony fosuserbundle sonata-admin sonata-user-bundle

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

  • Cliente :谁将访问前端并拥有字段'name','CPF','adress'。
  • Vendedor :谁将在网站上注册优惠并拥有字段'phone','CNPJ'
  • 管理员:谁将管理所有客户,Vendedores,优惠等...

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

我正在使用ApplicationSonataUserBundle,它生成实体User和Group。

这是我的代码:

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...
}

和Vendedor:

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...
}

AppKernel.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和Vendedor就没有与团体联系。我尝试添加$ 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未知列'f2_.id'在'on   条款“

这是创建用户类型的最佳实践吗?或者,而不是扩展ApplicationUserBundle:User,创建Cliente和Vendedor实体(不扩展ApplicationUserBundle:User),然后创建与User的关系(在用户实体中放置$ cliente和$ vendedor并建立关系)?

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

所有。

1 个答案:

答案 0 :(得分:1)

拥有多种用户类型的一种方法是使用Doctrine inheritance mapping

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

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

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

现在,在User中,使自定义fieds可以为空,并在UserAdmin中显示只有fieds用户类型可以使用安全rigths看到。例如:

if ($this->isGranted('ROLE_CLIENT')) {
    $formMapper->add('cpf');
}