首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FOSUserBundle覆盖角色-“Acme\Entity\User”中的“角色”属性已经声明,但只能声明一次

FOSUserBundle覆盖角色-“Acme\Entity\User”中的“角色”属性已经声明,但只能声明一次
EN

Stack Overflow用户
提问于 2014-03-28 16:45:52
回答 1查看 4.3K关注 0票数 2

我喜欢大多数人都试图覆盖FOSUserBundle角色,这样我就可以将它们映射为ManyToMany到角色实体。

不幸的是,由于模型/用户的映射,我得到以下信息:

代码语言:javascript
运行
复制
Property "roles" in "Acme\DemoBundle\Entity\User" was already declared, but it must be declared only once

在FOSUserBundle上发布的这个git问题中似乎提到了一些解决办法:

https://github.com/FriendsOfSymfony/FOSUserBundle/pull/1081#issuecomment-19027818

我是Doctrine,并且使用注释来映射而不是yml或xml。最新的Symfony (2.4)和最新的FOSUB。

我尝试了另一种选择,将所有东西复制到我的实体中,而不是扩展,但老实说,这把一切都搞砸了。

我正在尝试创建我自己的模型/用户扩展FOSUserBundle/Model/User而没有映射的想法。然后从这里扩展我的实体/用户。我试过了但我还是遇到了同样的问题。我想我做错了。

有人能建议我如何正确地做这件事吗?

我真的需要能够覆盖角色,因为尽管FOSUserBundle很棒,角色的适应却不是很好。尽管当时我很感激,但这是他们唯一能做到的方法,现在改变它已经打破了公元前。

希望有人能帮忙。

亲切问候保罗·庞德

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-07 14:22:22

我也有同样的问题,也使用注释。

注意:--因为有些读者有问题--我创建了一个gitHub回购与我的UserBundle。如果您发现这个HowTo中缺少什么东西,请让我知道,所以我添加它。

这篇文章涵盖了三个方面,基于DB的角色和树结构实现,框架配置也支持数据库角色的RoleHierarchy (getReachableRoles)。否则,在DB中拥有角色将是无用的。以及Doctrine订阅者,用于在被持久化的特定实体上创建角色。

FOS必须做的更改是深刻的,并且有很好的文档记录,但是我必须说,一个HowTo Use示例代码会阻止我阅读很多东西(至少我现在对编译器传递了解一点)。

对DB的角色

我使用的是SF2.4,但这应该可以从2.3开始工作。下面是我的解决方案所涉及的文件,请考虑每个文件一个步骤:

代码语言:javascript
运行
复制
./:
composer.json

src/Application/UsuarioBundle/:
ApplicationUsuarioBundle.php

src/Application/UsuarioBundle/Resources/config/doctrine/model/:
User.orm.xml

src/Application/UsuarioBundle/Entity/:
Role.php  Usuario.php

copmoser.json中,我对理论包进行了升级,使其包含所需的文件:

代码语言:javascript
运行
复制
"require": {
...
    "doctrine/doctrine-bundle": "~1.3@dev",
...
}

Bundle.php文件中,必须注册编译器传递。

代码语言:javascript
运行
复制
namespace Application\UsuarioBundle;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;
use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass;

class ApplicationUsuarioBundle extends Bundle
{

    public function build(ContainerBuilder $container)
    {
        parent::build($container);
        $mappings = array(
            realpath(__DIR__ . '/Resources/config/doctrine/model') => 'FOS\UserBundle\Model',
            realpath(__DIR__ . '/Resources/config/doctrine/model') => 'FOS\UserBundle\Entity', 
        );

        $container->addCompilerPass(
            DoctrineOrmMappingsPass::createXmlMappingDriver(
                $mappings, array('fos_user.model_manager_name'), false
            )
        );
}

这是新版本的教义包引入的依赖性:

代码语言:javascript
运行
复制
`\Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass`. 

我假设这个映射信息是在FOSUSerBundle之后添加的,因为我只是重复了我在FOSUerBundle.php中看到的过程(仅简化为ORM),希望它优先,而且确实如此。

User.orm.xml中的映射是第35行注释掉的./vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Resources/config/doctrine/model/User.orm.xml的确切副本。这将删除映射超类中角色的冲突映射。

代码语言:javascript
运行
复制
<!--<field name="roles" column="roles" type="array" />-->

从现在开始,你只做你想做的第一件事,实现你的角色理念。下面是我的:扩展FOS\UserBundle\Model\User的User类,但是现在使用您在包中使用的映射。

src/Application/UsuarioBundle/Entity/Role.php

以及角色类:

src/Application/UsuarioBundle/Entity/Usuario.php

在这样做之后,您可以看到模式update -转储- SQL转储了正确的sql更改。

代码语言:javascript
运行
复制
$ php app/console doctrine:schema:update --dump-sql --complete
CREATE TABLE fos_usuario_role (usuario_id INT NOT NULL, role_id INT NOT NULL, INDEX IDX_6DEF6B87DB38439E (usuario_id), INDEX IDX_6DEF6B87D60322AC (role_id), PRIMARY KEY(usuario_id, role_id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE fos_role (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(30) NOT NULL, role VARCHAR(20) NOT NULL, UNIQUE INDEX UNIQ_4F80385A57698A6A (role), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
ALTER TABLE fos_usuario_role ADD CONSTRAINT FK_6DEF6B87DB38439E FOREIGN KEY (usuario_id) REFERENCES fos_user (id) ON DELETE CASCADE;
ALTER TABLE fos_usuario_role ADD CONSTRAINT FK_6DEF6B87D60322AC FOREIGN KEY (role_id) REFERENCES fos_role (id) ON DELETE CASCADE;
ALTER TABLE fos_user DROP roles;

不过,我并不代表角色层次结构,这是我所需要的。

希望这对某人有用。我相信你已经解决了这个问题,或者丢掉了你的工作。

我所遵循的文件:

代码语言:javascript
运行
复制
https://github.com/symfony/symfony/pull/7599
https://github.com/FriendsOfSymfony/FOSUserBundle/pull/1081
http://symfony.com/doc/2.4/cookbook/doctrine/mapping_model_classes.html
http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html

RoleHierarchy实现

解决方案中涉及的文件:

代码语言:javascript
运行
复制
// The Magician, for I just re-instantiated RoleHierarchyVoter & ExpressionVoter 
// classes as ApplicationUsuarioBundle services; passing my RoleHierarchy 
// implementation. 
src/Application/UsuarioBundle/Role/RoleHierarchy.php

// duplicating security.access.expression_voter && 
// application_usuario.access.role_hierarchy_voter BUT WITH NEW 
// RoleHierarchy ARGUMENT
src/Application/UsuarioBundle/Resources/config/services.xml

// Entities, important methods are collection related
src/Application/UsuarioBundle/Entity/Role.php
src/Application/UsuarioBundle/Entity/Usuario.php

// Edited, commented out regular hardcoded roleHierarchy
app/config/security.yml

// CRUD related, sample files will add dependencies to lexik/form-filter-bundle; 
// docdigital/filter-type-guesser; white-october/pagerfanta-bundle
src/Application/UsuarioBundle/Controller/RoleController.php
src/Application/UsuarioBundle/Form/RoleType.php
src/Application/UsuarioBundle/Resources/views/Role/edit.html.twig
src/Application/UsuarioBundle/Resources/views/Role/index.html.twig
src/Application/UsuarioBundle/Resources/views/Role/new.html.twig
src/Application/UsuarioBundle/Resources/views/Role/show.html.twig

您可以在这个要旨中看到文件

或者直接访问每个文件(因为Gist不保留列表顺序)。

src/Application/UsuarioBundle/Role/RoleHierarchy.php

src/Application/UsuarioBundle/Resources/config/services.xml

src/Application/UsuarioBundle/Entity/Role.php

src/Application/UsuarioBundle/Entity/Usuario.php

app/config/security.yml

src/Application/UsuarioBundle/Controller/RoleController.php

src/Application/UsuarioBundle/Form/RoleType.php

src/Application/UsuarioBundle/Resources/views/Role/edit.html.twig

以下是文档:

食谱:安全选民

构成部分:安全

参考:服务标签优先级

汤: RoleHierarchyInterface

原则使用者

你会走到这一步才意识到有东西不见了..。

我将角色移植到DB的主要原因是,我正在处理一个动态(从结构角度来看)应用程序,该应用程序使用户能够配置工作流。当我添加一个新区域、一个新进程、一个新活动(或更新名称或父-子关系,或删除任何关系)时,我需要生成新角色( automatically )。

然后,您会想到LyfeCycleEvents的Doctrine订阅者,但是在PrePersist/PreUpdate中添加新的实体将需要嵌套的刷新,在我的示例中,这会使事情变得更加复杂,当您只需要更新已经"computedChanges“实体上的一些字段时就会更容易。

因此,我用来挂钩和创建/编辑/删除角色的是onFlush,此时computChangeSet()可以很好地用于添加新实体。

我将以ProcessRolesSubscriber吉斯特为例。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22718628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档