PHPackages                             snr/access\_descriptor - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. snr/access\_descriptor

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

snr/access\_descriptor
======================

Описывает доступ

1.0.0(9mo ago)04PHPPHP &gt;=7.3

Since Sep 5Pushed 9mo agoCompare

[ Source](https://github.com/semahinn/access_descriptor)[ Packagist](https://packagist.org/packages/snr/access_descriptor)[ RSS](/packages/snr-access-descriptor/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (5)Versions (3)Used By (0)

Описание
========

[](#описание)

AccessDescriptor это объект, который описывает данные о доступе определённых СУБЪЕКТОВ доступа по разным операциям ('view', 'edit', 'delete' и т.д.) к определённым ОБЪЕКТАМ доступа. Например, субъектами доступа в нашем случае являются пользователи, роли или что то другое, определяющее, КАК именно будет вычисляться доступ.

Установка
---------

[](#установка)

```
composer require snr/access_descriptor
```

Использование
=============

[](#использование)

Все примеры можно найти в файле tests/Test.php

1. По-умолчанию все обработчики доступа описываются в папке Plugin/AccessDescriptorHandler. Это можно переопределить, создав свой "Менеджер обработчиков", который должен реализовывать HandlerPluginManagerInterface. Хорошим решением будет унаследоваться от класса HandlerPluginManager.

```
class TestHandlerPluginManager extends HandlerPluginManager
{
   public function __construct(array $namespaces, EventDispatcherInterface $event_dispatcher)
   {
     parent::__construct($namespaces, $event_dispatcher);
     $this->subdir = "Dir\\SubDir";
   }
}
```

2. Вы должны зарегистрировать "Менеджер обработчиков" у себя в контейнере. В тестовом примере Test.php показывается как это сделать. Так, я использую класс HandlerPluginManager, т.к. меня устраивает стандартное поведение.

```
$container->register(HandlerPluginManager::class, HandlerPluginManager::class)
  // Вместо Snr\AccessDescriptor\Tests укажите пространство имён вашего проекта,
  // Вместо $root/tests - соответстующую директорию
  ->addArgument(["Snr\AccessDescriptor\Tests" => "$root/tests"])
  ->addArgument(new Reference('event_dispatcher'));
```

3. Обрботчики доступа хранятся в папке, указанной в HandlerPluginManager (в нашем случае это Plugin/AccessDescriptorHandler). Чтобы описать один из них, необходимо создать класс, наследующий базовый HandlerPlugin. В примере ниже мы описали обработчик с логикой вычисления доступа для субъекта 'users' (Пользователи).

```
/**
 * @AccessDescriptorHandler(
 *   id = "users",
 *   label = "Пользователи",
 *   description = "Пользователи",
 *   subjects = {
 *     "users",
 *   },
 * )
 */
class Users extends HandlerPlugin {

  /**
   * {@inheritdoc}
   */
  public function access(AccessDescriptorInterface $access_descriptor, $account, string $operation = 'all') {
    // ...
  }

  /**
   * {@inheritdoc}
   */
  public function getPluginManager() {
    // Должен возвращать экземпляр HandlerPluginManagerInterface из вашего контейнера
  }
}
```

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

```
/**
 * @AccessDescriptorHandler(
 *   id = "users_or_roles",
 *   label = "Пользователи и роли",
 *   description = "Пользователи и роли",
 *   subjects = {
 *     "users",
 *     "roles",
 *   },
 * )
 */
class UsersOrRoles extends HandlerPlugin
{
  /**
   * {@inheritdoc}
   */
  public function access(AccessDescriptorInterface $access_descriptor, $account, string $operation = 'all') {
    // ...
    return new AccessResultNeutral();
  }

  /**
   * {@inheritdoc}
   */
  public function getPluginManager() {
    // Должен возвращать экземпляр HandlerPluginManagerInterface из вашего контейнера
  }
}
```

4. Теперь мы может создавать экземпляры AccessDescriptor для вычисления значения доступа. Здесь написано, что он работает с субъектами 'users' и 'roles'. Т.е. для этих субъектов обязательно должны быть описаны обработчики (как в примерах выше).

```
    // Например, мы хотим описать доступ по 'Ролям' и 'Пользователям' к какой либо записи
    // Мы может сразу воспользоваться классом AccessDescriptor и создать его экземпляр
    // Под капотом он сам определит набор обработчиков, которые будет использовать
    $access_descriptor = new AccessDescriptor(['users', 'roles']);

    // Дадим доступ пользователям с идентификаторами 1 и 5 и всем
    // пользователям с ролью "Работник" ('employee')
    $access_descriptor->addAccess(['1', '5'], 'users');
    $access_descriptor->addAccess(['employee'], 'roles');

    // Получим значение, которое можно куда то сохранить
    $access_value = $access_descriptor->__toString();

    // ...

    // Создадим экземпляр AccessDescriptor из сохранённых значений
    $access_descriptor = new AccessDescriptor(['users', 'roles'], $access_value);
```

5. Вызвав метод access у экземпляра AccessDescriptor мы запускаем выполение логики во всех обработчиках. Если в определении доступа участвует несколько обработчиков, то их результаты объединяются с помощью логического ИЛИ.

```
    // Теперь для пользователя 'Dave' мы проверим его доступ к записи
    $access_result = $access_descriptor->access(User::dave());
```

6. Если мы попытаемся создать AccessDescriptor для недопустимого набора обработчков, а потом проверим доступ, то произойдёт исключение (обработчика для субъекта 'abdc' не существует).

```
    // Если мы попытаемся создать AccessDescriptor для недопустимого набора обработчков,
    // а потом проверим доступ, то произойдёт исключение (обработчика для субъекта 'abdc' не существует)
    try {
      $access_descriptor = new AccessDescriptor(['users', 'abdc']);
      $access_descriptor->access(User::dave());
    } catch (\Exception $ex) {
      $message = $ex->getMessage();
    }
```

###  Health Score

25

—

LowBetter than 35% of packages

Maintenance55

Moderate activity, may be stable

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity32

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

298d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/533289?v=4)[Senthil Nagaraja](/maintainers/snr)[@snr](https://github.com/snr)

---

Top Contributors

[![semahinn](https://avatars.githubusercontent.com/u/62962326?v=4)](https://github.com/semahinn "semahinn (2 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/snr-access-descriptor/health.svg)

```
[![Health](https://phpackages.com/badges/snr-access-descriptor/health.svg)](https://phpackages.com/packages/snr-access-descriptor)
```

###  Alternatives

[symfony/security-bundle

Provides a tight integration of the Security component into the Symfony full-stack framework

2.5k185.6M2.4k](/packages/symfony-security-bundle)[symfony/http-kernel

Provides a structured process for converting a Request into a Response

8.1k869.4M8.8k](/packages/symfony-http-kernel)[symfony/framework-bundle

Provides a tight integration between Symfony components and the Symfony full-stack framework

3.6k251.7M11.6k](/packages/symfony-framework-bundle)[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k17.9M386](/packages/easycorp-easyadmin-bundle)[matomo/matomo

Matomo is the leading Free/Libre open analytics platform

21.7k38.9k](/packages/matomo-matomo)[web-token/jwt-framework

JSON Object Signing and Encryption library for PHP and Symfony Bundle.

95220.7M103](/packages/web-token-jwt-framework)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
