2012-10-17 32 views
0

我在使用Symfony2,Doctrine和ACL時遇到了性能問題。如何避免在循環中使用ACL hasPermission進行多個數據庫查詢

在樹枝模板,我需要檢查的集合在當前用戶的每個公司的作用,顯示一個鏈接:

{%- if is_expr_granted("hasRole('ROLE_SUPPORT') or hasPermission(object, 'OPERATOR')", company) -%} 
    <a href="configure">{{- company.name -}}</a> 
{%- else -%} 

我可以在webProfiler看到2以下查詢是每家公司產生:

SELECT a.ancestor_id 
FROM acl_object_identities o 
INNER JOIN acl_classes c ON c.id = o.class_id INNER JOIN acl_object_identity_ancestors a ON a.object_identity_id = o.id 
WHERE ((o.object_identifier = '154' AND c.class_type = 'St\\CoreBundle\\Entity\\Company'))` 

而且

SELECT o.id as acl_id, o.object_identifier, o.parent_object_identity_id, o.entries_inheriting, c.class_type, e.id as ace_id, e.object_identity_id, e.field_name, e.ace_order, e.mask, e.granting, e.granting_strategy, e.audit_success, e.audit_failure, s.username, s.identifier as security_identifier 
FROM acl_object_identities o 
INNER JOIN acl_classes c ON c.id = o.class_id 
LEFT JOIN acl_entries e 
    ON (e.class_id = o.class_id AND (e.object_identity_id = o.id OR e.object_identity_id IS NULL)) 
LEFT JOIN acl_security_identities s ON (s.id = e.security_identity_id) 
WHERE (o.id =2189) 

如何避免在查詢循環?

回答

0

可以在一個查詢中預先加載Acl標識。看到這個問題:How do one use ACL to filter a list of domain-objects according to a certain user's permissions (e.g. EDIT)?

您必須添加這樣的事情你控制器

// you entities 
$companies = ... 

// the acl provider 
$aclProvider = $this->get('security.acl.provider'); 

// build up array of object identities 
$oids = array(); 
foreach ($companies as $company) { 
    $oids[] = ObjectIdentity::fromDomainObject($company); 
} 

// preload acls 
$aclProvider->findAcls($oids); // preload Acls from database 
+0

謝謝室,我們將測試:) – Jerem

相關問題