Symfony 4: Doctrine-entity возвращает разные данные на основе ROLE_ * - PullRequest
0 голосов
/ 01 июня 2018

Я получил объект Account, который должен возвращать различные данные в зависимости от ролей текущего пользователя, вошедшего в систему:

return [                                     // to be returned if user has role:
    'id' => $this->id,                       // ROLE_USER, ROLE_PAYED, ROLE_ADMIN
    'name' => $this->name,                   // ROLE_USER, ROLE_PAYED, ROLE_ADMIN
    'hobbies' => ['some', 'tags'],           // ROLE_PAYED, ROLE_ADMIN
    'roles' => ['ROLE_USER', 'ROLE_PAYED']   // ROLE_ADMIN
];

Если бы я сделал это изменение внутри контроллера, я бы просто вызвал избиратель .Но я хотел бы использовать его внутри jsonSerialize -функции сущности, чтобы она реализовывалась внутри каждого без исключения запроса.

Я думаю, что реальный вопрос в том, как получить«избиратель внутри сущности», но я на самом деле недостаточно знаю о Symfony (использую его только 10 дней).

1 Ответ

0 голосов
/ 02 июня 2018

Избиратели - это услуги, и услуги действительно не должны быть внутри сущностей.Сущности не должны иметь никаких знаний о чем-либо в представлении или контроллере.Если вам нужны службы внутри сущностей, это, как правило, признак того, что вам нужно переосмыслить свою архитектуру.

Подход, который я выбрал бы, заключается в создании службы JsonSerializeAccount, которая использует AuthorizationChecker для создания массива json.

<?php

namespace App\Service;

use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use App\Entity\Account;

class JsonSerializeAccount {
    /**
     * @var AuthorizationCheckerInterface
     */
    private $authorizationChecker;

    public function __construct(AuthorizationCheckerInterface $authorizationChecker)
    {
        $this->authorizationChecker = $authorizationChecker;
    }

    public function jsonSerialize(Account $account): array
    {
        $json = [
            'id' => $account->getId(),
            'name' => $account->getName(),
        ];

        if ($this->authorizationChecker->isGranted('view_hobbies', $account)) {
            $json['hobbies'] = $account->getHobbies();
        }

        if ($this->authorizationChecker->isGranted('view_roles', $account)) {
            $json['roles'] = $account->getRoles();
        }

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