0

私は Symfony2、Doctrine、および ACL を使用していますが、パフォーマンスの問題に遭遇しました。

Twig テンプレートでは、コレクション内の各会社の現在のユーザーの役割を確認して、リンクを表示する必要があります。

{%- 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)

ループ内でのクエリを回避するには?

4

1 に答える 1

0

Acl ID は、1 つのクエリ内でプリロードできます。次の質問を参照してください: ACL を使用して、特定のユーザーのアクセス許可 (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
于 2012-10-18T08:27:18.553 に答える