2016-09-10 1 views
2

나는 Sonata User Bundle의 사용자를 만듭니다. 섹션 2.5 Extending the Bundle 아래의 문서에 따르면 그들은 사용자 및 그룹 엔티티에 대한 완전한 새 번들을 생성해야합니다. 나는 이것이 완전히 불필요하다고 생각하고 나는 여분의 번들을 원하지 않는다. 그래서 내 AppBundle에 내 사용자 및 그룹 엔티티를 만들었고 Sonata \ UserBundle \ Entity \ BaseUser 엔티티에서 확장했습니다.Override Sonata 사용자 서비스 메뉴 그룹

이 후, 내 fos_user user_class 및 group_class를 새 엔티티로 변경했습니다.

fos_user: 
    db_driver:  orm 
    firewall_name: main 
    user_class:  AppBundle\Entity\User 

    group: 
     group_class: AppBundle\Entity\Group 
     group_manager: sonata.user.orm.group_manager 

    service: 
     user_manager: sonata.user.orm.user_manager 

모든 나는 FOS 사용자 명령 줄을 통해 사용자를 만들 수 있고, 내가 로그인 할 수있는, 완벽하게, 내 데이터베이스 내 사용자 및 그룹 테이블이 제대로 생성되어 작동합니다. 메뉴에서

은 자동입니다 사용자 및 그룹 엔티티가 포함 된 생성 된 사용자 그룹입니다 (아래 이미지 참조). 이제 유일한 문제는 자신의 엔티티 클래스를 사용하기 위해이 엔티티의 서비스를 재정의하는 것입니다. 그 중 하나를 클릭하면 원치 않는 확장 된 번들의 엔티티가 필요하기 때문입니다. 소나타가 내 서비스를 사용하도록 어떻게 알 수 있습니까? 아니면 사용자 (사용자 및 그룹 포함)를 완전히 제거하거나 숨길 수 있습니까?

enter image description here

답변

1

는 소나타 사용자 번들 파일의 일부 파고 후, 나는 엔티티가 매개 변수를 설정할 수 있습니다 것을 알 수있다. 그래서 내가해야만하는 것은 추가하는 것입니다.

parameters: 
    sonata.user.admin.user.entity: AppBundle\Entity\User 
    sonata.user.admin.group.entity: AppBundle\Entity\Group 

내 config.yml 파일에 있습니다.

1

"또는 심지어 사용자 (사용자 및 그룹 포함)를 완전히 제거하거나 숨길 수 있습니까?"

그래서 SonataUserBundle과 AppBundle이 있습니다. 두 경우 모두 사용자 및 그룹 엔터티가 있습니다. 그리고 우리는 소나타에서 엔티티를 사용하고 싶지 않습니다. 그러나 SonataUserBundle에는 이미 UserAdmin 및 GroupAdmin 클래스가 있습니다. 관리자 메뉴에 SonataUserBundle를 설치 한 후이 개 서비스를 표시하는 이유입니다 그 :

아시다시피

enter image description here

, 우리는 services.yml 파일에 선언 모든 소나타 관리 클래스입니다. 는 SonataUserBundle에서 우리는 소나타 개발자에서 서비스를 선언 다른 파일을 가지고 교리 ORM을 사용하는 경우 우리는이 경로에있다 admin_orm.xml 파일에 표시되어야합니다.

vendor/sonata-project/user-bundle/Resources/config/admin_orm.xml 

우리가 찾을 수있는 파일 내부 관리자 서비스의 선언 - UserAdmin 및 GroupAdmin :

<?xml version="1.0" encoding="UTF-8"?> 
<container xmlns="http://symfony.com/schema/dic/services"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://symfony.com/schema/dic/services  http://symfony.com/schema/dic/services/services-1.0.xsd"> 
    <parameters> 
    <parameter  key="sonata.user.admin.groupname">sonata_user</parameter> 
     <parameter  key="sonata.user.admin.label_catalogue">SonataUserBundle</parameter> 
     <parameter key="sonata.user.admin.groupicon"><![CDATA[<i class='fa fa-users'></i>]]></parameter> 
</parameters> 
<services> 
    <service id="sonata.user.admin.user" class="%sonata.user.admin.user.class%"> 
     <tag name="sonata.admin" manager_type="orm" group="%sonata.user.admin.groupname%" label="users" label_catalogue="%sonata.user.admin.label_catalogue%" label_translator_strategy="sonata.admin.label.strategy.underscore" icon="%sonata.user.admin.groupicon%"/> 
     <argument/> 
     <argument>%sonata.user.admin.user.entity%</argument> 
     <argument>%sonata.user.admin.user.controller%</argument> 
     <call method="setUserManager"> 
      <argument type="service" id="fos_user.user_manager"/> 
     </call> 
     <call method="setTranslationDomain"> 
      <argument>%sonata.user.admin.user.translation_domain%</argument> 
     </call> 
    </service> 
    <service id="sonata.user.admin.group" class="%sonata.user.admin.group.class%"> 
     <tag name="sonata.admin" manager_type="orm" group="%sonata.user.admin.groupname%" label="groups" label_catalogue="%sonata.user.admin.label_catalogue%" label_translator_strategy="sonata.admin.label.strategy.underscore"/> 
     <argument/> 
     <argument>%sonata.user.admin.group.entity%</argument> 
     <argument>%sonata.user.admin.group.controller%</argument> 
     <call method="setTranslationDomain"> 
      <argument>%sonata.user.admin.group.translation_domain%</argument> 
     </call> 
    </service> 
</services> 

여기에 우리의 서비스의 식별자 볼 수 있듯이 :

을 0
sonata.user.admin.user 
sonata.user.admin.group 

그들을 덮어 쓰는 가장 간단한 방법은 services.yml 파일에서 동일한 서비스 (이 ID를 사용할 것임)를 만드는 것입니다. 예, 당신은 나와 함께 논쟁 할 수 있습니다,이 방법은 어리 석다,하지만 내가 말했듯이 그것은 유일한 것이 아닙니다.우리 services.yml의 의지에

그래서 소나타 서비스는 다음과 같습니다

sonata.user.admin.user: 
    class: "%sonata.user.admin.user.class%" 
    arguments: [~, "%sonata.user.admin.user.entity%", "%sonata.user.admin.user.controller%"] 
    tags: 
     - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "users", icon: "<i class=\"fa fa-users\"></i>" } 
    calls: 
     - [ setUserManager, [ "@fos_user.user_manager" ] ] 
     - [ setTranslationDomain, [ "%sonata.user.admin.user.translation_domain%" ] ] 

sonata.user.admin.group: 
    class: "%sonata.user.admin.group.class%" 
    arguments: [~, "%sonata.user.admin.group.entity%", "%sonata.user.admin.group.controller%"] 
    tags: 
     - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "groups" } 
    calls: 
     - [ setTranslationDomain, [ "%sonata.user.admin.group.translation_domain%" ] ] 

는 이제 관리자 대시 보드를 업데이트하고 볼 수 있습니다, 아무 일도하지 않았는지. 그러나 우리의 목적은 대시 보드와 메뉴에서이 서비스를 비활성화하는 것이 었습니다. 트릭을 만들어 봅시다. 이 서비스의 선언에 services.yml에

show_in_dashboard: false 
tags: 
     - { show_in_dashboard: false, name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "users", icon: "<i class=\"fa fa-user\"></i>" } 

을 추가하십시오.

따라서 우리의 서비스는 다음과 같이됩니다 :이 사소한 조작 소나타 서비스 후

sonata.user.admin.user: 
    class: "%sonata.user.admin.user.class%" 
    arguments: [~, "%sonata.user.admin.user.entity%", "%sonata.user.admin.user.controller%"] 
    tags: 
     - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "users", icon: "<i class=\"fa fa-user\"></i>", show_in_dashboard: false } 
    calls: 
     - [ setUserManager, [ "@fos_user.user_manager" ] ] 
     - [ setTranslationDomain, [ "%sonata.user.admin.user.translation_domain%" ] ] 

sonata.user.admin.group: 
    class: "%sonata.user.admin.group.class%" 
    arguments: [~, "%sonata.user.admin.group.entity%", "%sonata.user.admin.group.controller%"] 
    tags: 
     - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "groups", show_in_dashboard: false } 
    calls: 
     - [ setTranslationDomain, [ "%sonata.user.admin.group.translation_domain%" ] ] 

을 완전히 대시 보드에서 사라집니다.