OneToMany access_control на ресурсе api-платформы - PullRequest
0 голосов
/ 28 августа 2018

Я хочу проверить access_control из подресурса, но он не работает.

Моя первая сущность имеет отношения OneToMany со второй.

ЦСИ / Entity / Course.php

/**
 * @ApiResource(
 *     collectionOperations={
 *         "get"={"access_control"="object.userCompanyRoles.user == user"}
 *     }
 * )
 *
 * @ORM\Table(name="course")
 * @ORM\Entity(repositoryClass="App\Repository\CourseRepository")
 */
class Course
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="UserCompanyRole", mappedBy="course")
     * @ApiSubresource()
     */
    private $userCompanyRoles;
}

ЦСИ / Entity / UserCompanyRole.php

/**
 * @ApiResource()
 * @ORM\Table(name="user_company_role")
 * @ORM\Entity(repositoryClass="App\Repository\UserCompanyRoleRepository")
 */
class UserCompanyRole
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Course", inversedBy="userCompanyRoles", cascade={"all"})
     */
    private $course;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="userCompanyRoles", cascade={"all"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;
}

Но когда я отправляю запрос, у меня есть это:

"гидра: описание": "Примечание: неопределенное свойство: ApiPlatform \ Core \ Bridge \ Doctrine \ Orm \ Paginator :: $ userCompanyRoles",

Я не могу упростить свои отношения, потому что многие пользователи могут иметь много ролей на курсах.

У кого-нибудь есть предложения по моей проблеме? Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

В коллекции нет переменной object, доступной в выражении безопасности. Вы можете написать расширение. Вот пример, который фильтрует коллекцию по текущему пользователю, точно так же, как вы пытаетесь:

https://api -platform.com / документы / ядро ​​/ расширения /

0 голосов
/ 12 сентября 2018

Вы находитесь в collectionOperations, так что это означает, что вы собираетесь получить массив. Ну, это будет не совсем массив, но Paginator, поэтому object.userCompanyRoles будет Paginator, потому что это то, что вы извлекаете.

Ваш object.userCompanyRoles на access_control должен работать, если вы были в itemOperations.

Итак, как добавить контроль доступа на /courses? Прежде всего вам не понадобится ApiSubresource. Эта аннотация означает, что вы можете перечислить userCompanyRoles, которые принадлежат идентификатору элемента course по запросу /courses/{id}/user_company_roles

Насколько я понимаю, вы хотите иметь возможность перечислять courses, только если ваш user указан в userCompanyRoles.user. Для меня это не похоже на управление доступом, но больше похоже на переопределение operation или событие filter, потому что когда вы запрашиваете /courses, оно должно быть отфильтровано относительно вашего подключенного пользователя, верно?

https://api -platform.com / Docs / ядро ​​/ операции https://api -platform.com / Docs / ядро ​​/ фильтры

Дайте мне знать, если у вас все еще проблемы.

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