Symfony2 ACL и пейджер/фильтрация нескольких сущностей

Я видел примеры ACL для работы с одним объектом, но не для получения нескольких элементов, таких как список сообщений, принадлежащих автору. Одно (плохое) предложение заключалось в том, чтобы получить все элементы, а затем отфильтровать их с помощью acl — это не сработает, когда у нас будет миллион элементов. Каков предполагаемый способ получения нескольких элементов - скажем, я хочу получить все свои сообщения (используя любые критерии, которые мне нужны, например, опубликованные или упорядоченные) партиями по 50 для пейджера (еще одна причина, почему фильтрация сообщений не будет работать - я в конечном итоге с разными размерами страниц).


person cyberwombat    schedule 11.09.2011    source источник
comment
Вы не должны использовать ACL, чтобы определить, какие сообщения принадлежат автору. Перед получением всех сущностей пользователя вы должны использовать ACL, чтобы проверить, является ли извлечение всех сущностей пользователя разрешенным действием или нет. Если это так, выполните действие. Если нет, то нет.   -  person hakre    schedule 01.11.2011
comment
Прошу прощения? Как мой код узнает, какие элементы принадлежат пользователю, если я не использую ACL? Мне пришлось бы добавлять ссылку на пользователя в свои сообщения - весь смысл acl в том, чтобы этого не делать. Можете ли вы объяснить, что я не понимаю, пожалуйста?   -  person cyberwombat    schedule 01.11.2011
comment
Как ваш ACL узнает, что такое пользователь? Пользователи - это объекты (не должен означать класс, я имею в виду широкое значение объекта в программировании, например, целое число, содержащее идентификатор пользователя), поэтому и ACL, и остальная часть вашего приложения совместно используют домен здесь. ACL должен сидеть поверх него, он не должен сидеть везде. Если вы заставите сидеть везде, вы столкнетесь с проблемой, которая у вас есть в вопросе. Если вы этого не сделаете, у вас нет. Держите функциональные части вашего приложения отдельно друг от друга. ACL — это ACL, сообщения — это сообщения. В вашем контролере или ваших бизнес-моделях сведите их воедино, но не раньше.   -  person hakre    schedule 02.11.2011
comment
В symfony, если вы хотите получить одно сообщение для пользователя, вы должны: а) получить сообщение, а затем б) проверить разрешение acl для этого сообщения/текущего пользователя. Отлично. Проблема в том, что это не работает эффективно для нескольких элементов. Например, не представляется возможным получить первые 50 сообщений, которые этому пользователю разрешено редактировать. Что я могу сделать, так это получить каждое сообщение в моей базе данных, а затем пройти через ACL, пока у меня не будет 50, что, очевидно, непригодно для использования. Я имею в виду, что это общая проблема, и в настоящее время нигде нет решений - этот вопрос задавался неоднократно, и это очень реальная проблема.   -  person cyberwombat    schedule 03.11.2011
comment
Все, что есть на данный момент, это попытка github исправить acl, разрешив соединения, но в прошлый раз, когда я смотрел, это было очень много в работе.   -  person cyberwombat    schedule 03.11.2011
comment
Привет @Yashua, ты когда-нибудь находил для этого хорошее решение? В настоящее время я нахожусь на грани того, что было предложено в этом вопросе другими пользователями. Но это кажется грязным, потому что я в одной лодке с тобой. Ваше здоровье   -  person SamV    schedule 17.02.2015
comment
@SamV - вроде как - я перешел на NodeJS и отказался от PHP / Symfony :) Лучшее, что я когда-либо делал.   -  person cyberwombat    schedule 17.02.2015
comment
Ааа, хорошо, спасибо @Yashua, сейчас это не вариант :p   -  person SamV    schedule 18.02.2015


Ответы (1)


Я думаю, вам не следует использовать ACL для определения того, какие сообщения принадлежат конкретному автору, потому что ACL предназначен для управления доступом/разрешениями, а не для поиска владельцев или определения объектных отношений.

Но, конечно, вы можете получить список сообщений, которые определенный пользователь может просматривать, редактировать или модерировать, например.

В настоящее время нет возможности сделать это на уровне API, но... ну, я думаю, в Symfony2/Doctrine2 вы можете просто сделать Native Query и присоединиться с помощью таблица acl_entries.

Но есть недостаток. В большой системе таблица acl_entries будет содержать слишком много строк, и соединение с ней может быть медленным (мы знаем, что MySQL иногда бывает глупым). Таким образом, вы также можете создать какую-то систему кэширования вокруг этого.

person Vladislav Rastrusny    schedule 18.11.2011
comment
Я просто сбит с толку, что это не было рассмотрено. Это означает отсутствие генератора администрирования и пейджинга на собственном уровне. - person cyberwombat; 19.11.2011
comment
Я чувствую, что что-то упускаю. Вы и hakre предлагаете не использовать acl для получения сообщений, принадлежащих пользователю, а вместо этого использовать acl, чтобы узнать, могут ли они это сделать. Я просто не понимаю этого. Я должен отслеживать всех пользователей, которые могут редактировать сообщение за пределами структуры acl, тогда зачем вообще существует acl? Я знаю, что пользователь может редактировать/удалять сообщение, так как я должен управлять этим сам - мне не нужен acl, чтобы сказать мне то же самое. То, что acl говорит мне, что пользователь может получать сообщения, принадлежащие ему, практически бесполезно. Так что я думаю, что я не получаю что-то фундаментальное. - person cyberwombat; 09.03.2012
comment
Я также весьма сбит с толку заявлениями, сделанными здесь, и согласен с @cyberwombat. Я думал о том, как я могу содержать и отделять логику контроля доступа. По сути, я думаю, что лучшая идея - выполнить запрос к ACL для всех объектов, которые проходят маску разрешений, и получить список идентификаторов этих объектов. Затем я могу использовать этот полный список во втором запросе, который также может обрабатывать разбиение на страницы. - person Beyerz; 04.04.2018