Php FOSUserBundle覆盖角色-属性“;角色“;在;Acme\DemoBundle\Entity\User“;已声明,但只能声明一次
我喜欢大多数人都试图覆盖FOSUserBundle角色,这样我就可以将它们很多映射到一个角色实体 不幸的是,由于模型/用户的映射,我得到以下结果:Php FOSUserBundle覆盖角色-属性“;角色“;在;Acme\DemoBundle\Entity\User“;已声明,但只能声明一次,php,symfony,doctrine-orm,fosuserbundle,symfony-2.4,Php,Symfony,Doctrine Orm,Fosuserbundle,Symfony 2.4,我喜欢大多数人都试图覆盖FOSUserBundle角色,这样我就可以将它们很多映射到一个角色实体 不幸的是,由于模型/用户的映射,我得到以下结果: Property "roles" in "Acme\DemoBundle\Entity\User" was already declared, but it must be declared only once FOSUserBundle上发布的这期git中似乎提到了一些解决方法: 我正在使用ORM和注释进行映射,而不是yml或xml。最新Sym
Property "roles" in "Acme\DemoBundle\Entity\User" was already declared, but it must be declared only once
FOSUserBundle上发布的这期git中似乎提到了一些解决方法:
我正在使用ORM和注释进行映射,而不是yml或xml。最新Symfony(2.4)和最新FOSUB
我尝试了另一种选择,将所有内容复制到我的实体中,不进行扩展,但老实说,这会把所有内容都搞糟
我正在尝试创建自己的模型/用户,扩展FOSUserBundle/Model/User,而不使用映射。然后在此基础上扩展我的实体/用户。我试过了,但还是遇到了同样的问题。我想我做得不对
有人能建议/展示我如何正确地做到这一点吗
我真的需要能够覆盖角色,因为虽然FOSUserBundle很好,但是角色的适应性不是很好。虽然我当时很感激这是他们唯一能做到的方法,但现在改变它就打破了BC
希望有人能帮忙
问候
保罗·庞德(Paul Pounder)我也有同样的问题,也使用了注释 注意:由于一些读者在整合所有内容时遇到问题,我创建了一个。如果您发现本指南中缺少某些内容,请告诉我,以便我添加它 这篇文章涵盖了三个方面,基于数据库的角色采用树状结构实现,框架配置也支持数据库角色的角色层次结构(getReachableRoles)。没有它,在DB中拥有角色毕竟是无用的。和在持久化的特定实体上创建角色 FOS所做的更改是深刻的,并且有很好的文档记录,但我必须说,一个
如何使用示例代码会阻止我大量阅读(不是抱怨,至少我现在对编译器过程了解一点)
数据库的角色
我使用的是SF2.4,但从2.3开始就应该可以了。这是我的解决方案涉及的文件,考虑每个文件的一个步骤:
./:
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
中,我升级了条令包,使其包含所需的文件:
"require": {
...
"doctrine/doctrine-bundle": "~1.3@dev",
...
}
在Bundle.php
文件中,必须注册一个编译器过程
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
)
);
}
这是新版本的条令包导入的依赖项:
`\Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass`.
我假设这个映射信息是在FOSUerBundle之后添加的,因为我只是重复了我在FOSUerBundle.php中看到的这个过程(仅针对ORM进行了简化),希望它优先于FOSUerBundle
User.orm.xml
中的映射是/vendor/friendsofsymfony/User bundle/FOS/UserBundle/Resources/config/doctor/model/User.orm.xml
的精确副本,第35行被注释掉。这将删除映射的超类中角色的冲突映射
不过,我并没有表示我需要的角色层次结构
希望对别人有用。我相信你已经解决了这个问题,或者丢掉了工作
我遵循的文件:
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
角色层次结构实现
解决方案中涉及的文件:
// 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不保留列表顺序)
随后的文档:
// 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
条令订阅者
你会走到这一步,意识到有些东西不见了
我将角色移植到DB的主要原因是,我正在处理一个动态(从结构角度)应用程序,该应用程序使用户能够配置工作流。当我添加新区域、新流程、新活动(或更新名称或父子关系,或删除任何内容)时,我需要自动生成新角色
然后考虑LyfeCycleeEvents的Doctrine订阅服务器,但是在PrePersist/PreUpdate中添加新实体将需要嵌套刷新,在我的例子中,这会把事情搞砸,当您只需要更新已经“computedChanges”实体上的一些字段时,这会更容易
因此,我用来钩住和创建/编辑/删除角色的是onFlush,此时computChangeSet()可以很好地用于添加新实体
我将以为例。为什么不使用FOSUserBundle的组功能?不要使用FOS提供的用户包。这将是一个地狱般的旅程。更好地构建您的自定义提供程序
。很容易实现。我已经在应用程序中使用组来存储公司中的用户,并针对他们应用角色。我仍然需要能够针对特定用户应用角色,而不是对他们进行分组@cept0-我同意,但它非常适合我的需要(除了角色):)可能是我最终使用了组,并改变了我存储公司的方式,但我想我会先调查一下。另外,FOSUserBundle与我正在使用的其他捆绑包集成良好,所以现在不想破坏这一链接。@PaulPounder关于您对FOS用户捆绑包完整性的评论:没有特殊的magic FOS用户捆绑包集成。该捆绑包将自身集成到Symfony中,其他捆绑包可以使用此“桥”。我感谢您对StackOverflow编辑器的坚持。这是一个很好的解决方案。老实说,我还没有解决这个问题,谢天谢地我还在工作:-)谢谢,我很高兴你还在工作。我正在为此实施RoleHierarchyVoter。完成后我会把它添加到答案中。谢谢,非常有用的帖子。但有一个问题。例如,当您想从用户中完全删除$roles时,若您将其存储在单独的数据库中,因为EntityManager从所有父类加载元数据,所以结果将失败,除非不存在此类列的角色
// 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