Посоветуйте с алгоритмом доступа:
1.Есть сущность - верхнего уровня, к ней определён доступ пользователя.
2.Есть дочерняя промежуточная сущность и есть дочерняя сущность у промежуточной.
3.В общем есть иерархия через entity_reference этого всего.
Вопрос: как мне лучше всего организоваьт проверку доступа к дочерним сущностям на основе доступа к самой верхней? Может есть что-то готовое?
Комментарии
Задачка очень не стандартная, поэтому предположу, что готовое решение врядли имеется.
Как я понял, в Вашем случае связь один-к-одному, т.к. дочерняя сущность может принадлежать только одному родителю (чтобы наследовать права доступа только от одного родителя).
При организации связи через поле entityreference непосредственно дочерняя сущность ничего не знает о родительской, т.к. связь производится через поле родительской сущности.
Можно конечно извратиться и специальным запросом к БД вытаскивать из нее родительскую сущность для дочерней, но тут чревато граблями, как минимум надо будет еще контролировать, чтобы у дочерней сущности был только один родитель.
Значит надо сделать так, чтобы дочерняя сущность связывалась с родительской как-то более очевидно.
Самый простой способ, это чтобы не в родительской сущности было поле связи с дочерней, а наоборот:
чтобы в дочерней сущности было поле entityreference на сущность, от которой она будет наследовать права доступа (родительскую).
Способ сложнее, но универсальнее - реализовать связь родитель-ребенок1-реденок2-ребенок-N например по принципу "materialized path", примерно такой используется в "стандартном" модуле book.
Связь может быть и один ко многим, тогда доступ будет если хотя бы у одной сущности верхнего уровня будет доступ. У кастомных сущностей уже есть спец. поле, по которым можно отследить цепочку, но вот, например, если необходимо контролировать медиа сущности, которые могут прикрепляться к этим кастомным?
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21...
А родительскую сущность можно достать через
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21...
Дедовские и прадедовские можно доставать через многократный вызов loadByProperties. Там запросы простые и в рамках того количества запросов, что делает друпал эти плюс два-три запроса погоду не сделают.
Можно ещё извратиться и за один хитрый запрос с джойнами достать нужный айдишник.
Спасибо, помогло!
Подскажи, есть ли другой способ определения дочерней сущности кроме EntityStorageBase::loadByProperties.
Может как-то можно определить контекст вызова?
Дочерней или родительской? Что касается контекстов, мне как-то не довелось с ними толком поработать. Всё, что я знаю о контекстах - это то, что они есть)))
Да, описался, родительской, конечно!
Модуль в помощь https://www.drupal.org/project/entity_access