2014-03-05 26 views
1

symfony 2覆蓋配置中的現有服務定義?

供應商/ symfony中/ symfony中/ src目錄/ Symfony的/包/ SecurityBundle /資源/配置/ security.xml文件

<service id="security.access.role_hierarchy_voter" class="%security.access.role_hierarchy_voter.class%" public="false"> 
     <argument type="service" id="security.role_hierarchy" /> 
     <tag name="security.voter" priority="245" /> 
    </service> 

定義。服務類,

的Symfony \分量\安全\核心\授權\選民\ RoleHierarchyVoter

有第二個參數$ PREFIX = 'ROLE_' 爲默認值。

在上述服務認定中,第二個參數沒有通過,因此採取默認值ROLE_

在我的申請,我有傳統角色,e.g登錄。沒有ROLE_前綴。

我想覆蓋上面的服務定義,並通過第二個參數爲空。

  <service id="security.access.role_hierarchy_voter" class="%security.access.role_hierarchy_voter.class%" public="false"> 
      <argument type="service" id="security.role_hierarchy" /> 
      <argument></argument> 
      <tag name="security.voter" priority="245" /> 
     </service> 

我該怎麼做?

回答

2

您可以創建一個新類,它可以擴展Symfony\Component\Security\Core\Authorization\Voter\RoleHierarchyVoter

在您創建的類中,前綴在您的控制之下,您所要做的僅僅是更改構造方法。

代碼:

public function __construct(RoleHierarchyInterface $roleHierarchy) 
{ 
    parent::__construct($roleHierarchy, 'THE_PREFIX_YOU_WANT_TO_SET'); 
} 

參數security.access.role_hierarchy_voter.class然後設置爲您創建的類。

編輯:

設置與空字符串的前綴可能會導致警告,覆蓋RoleVotersupportAttribute是另一種解決方案。

+0

謝謝,它的工作,但還有一個問題,因爲我不想要前綴,我傳遞空字符串,並在供應商/ symfony/symfony/src/Symfony /組件/安全/核心/授權/選民/ RoleVoter。 php,supportsAttribute()0 === strpos($ attribute,$ this-> prefix);給出警告作爲$ this->前綴是空的 – vishal

+0

我認爲,它更好地重寫RoleVoter並從supportAttribute始終返回true? – vishal

+0

@ user1191081是的,只是試試:) – xdazz