Intereting Posts
Установите локаль на лету в laravel4 Средство проверки подлинности Laravel 5 всегда перенаправляется на root или login Почему я вижу значение «undefined» на экране при отправке формы в jQuery Mobile? активировать активную запись codeigniter и запрашивать запрос без предложения LIMIT Синтаксическая ошибка Sql с использованием запроса базы данных UPDATE Ошибка PHP CRYPT_BLOWFISH? Использовать PHP для отображения результатов MySQL в таблице HTML PHPMailer говорит, что класс не существует, но он делает Woocommerce: отображение описания продукта на странице в корзине как придерживаться принципа Don't-Repeat-Yourself (DRY), когда будет слишком много if-then-else, делая код нечитаемым? Отправить письмо с помощью PHPMailer – вставить изображение в тело Скопировать содержимое файла в другой файл Таблицы стилей Laravel и javascript не загружаются для не-базовых маршрутов PHP Zip Archive спорадически создает несколько файлов Ошибка «Преждевременный конец данных» с PHP

Как отфильтровать мои запросы доктрины с помощью Symfony ACL

Symfony ACL позволяет мне предоставлять доступ к объекту, а затем проверять его:

if (false === $securityContext->isGranted('EDIT', $comment)) { throw new AccessDeniedException(); } 

Однако, если у меня есть тысячи объектов в базе данных, и у пользователя есть доступ только к 10 из них, я не хочу загружать все объекты в памяти и убирать их.

Как я могу сделать простой «SELECT * FROM X» при фильтрации только на сущности, к которым у пользователя есть доступ (на уровне SQL)?

Solutions Collecting From Web of "Как отфильтровать мои запросы доктрины с помощью Symfony ACL"

Ну вот он: это невозможно .

В прошлом году я работал над альтернативной системой ACL, которая позволяла напрямую фильтровать запросы к базе данных.

Моя компания недавно согласилась открыть исходный код, поэтому вот оно: http://myclabs.github.io/ACL/

Как было указано в предыдущем обсуждении,

В первом запросе получите список (с пользовательским запросом) всех объектов object_identity_ids (для определенного объекта / класса X), к которому пользователь имеет доступ.

Затем, при запросе списка объектов для объекта / класса X, добавьте в запрос «IN (object_identity_ids)» .

Маттье, меня не устраивало, отвечая на большее количество догадок (так как мои предположения не добавляют ничего полезного для разговора). Поэтому я сделал несколько этапов для этого подхода (Digital Ocean 5 $ / mo VPS).

эталонный тест

Как и ожидалось, размер таблицы не имеет значения при использовании подхода массива IN. Но большой размер массива действительно заставляет вещи выходить из-под контроля.

Итак, Join approach IN array approach ?

JOIN действительно лучше, когда размер массива огромен. НО, это предполагает, что мы не должны рассматривать размер таблицы. Оказывается, на практике массив IN быстрее – за исключением случаев, когда имеется большая таблица объектов, а записи acl охватывают почти каждый объект (см. Связанный вопрос).

Я расширил свои рассуждения по отдельному вопросу. См. При использовании ACL от Symfony лучше использовать запрос JOIN или запрос массива IN?

Вы могли бы взглянуть на фильтры Doctrine . Таким образом, вы можете расширить все запросы. Я еще не сделал этого, и есть некоторые ограничения, о которых идет речь. Но, возможно, это поможет вам. Здесь вы найдете описание таблиц базы данных ACL.

ОБНОВИТЬ

Каждый фильтр возвращает строку, и все эти строки будут добавлены к SQL-запросам следующим образом:

 SELECT ... FROM ... WHERE ... AND (<result of filter 1> AND <result of filter 2> ...) 

Также псевдоним таблицы передается методу фильтра. Поэтому я думаю, что вы можете добавить подзапросы здесь, чтобы отфильтровать ваши сущности.