Если вы используете JMSSerializer
, вы можете использовать группы, чтобы решить, что можно увидеть или нет. Затем в вашем контроллере или где бы то ни было, вы можете установить группу на основе роли.
Например, при отображении (в YAML) ..
Fully\Qualified\Class\Name:
exclusion_policy: ALL
properties:
id:
groups: [user]
userAndAdmin:
groups: [user]
adminOnly:
groups: [admin]
И тогда в вашем контроллере вы бы установить группу как ...
public function getUsersAction(Request $request)
{
$users = $this->getRepository()->findAll();
$serializer = $this->get('jms_serializer.serializer');
$json = $serializer->serialize(
$users,
'json',
SerializationContext::create()->setGroups($this->generateGroups())
);
return new Response($json);
// If you are using FOSRestBundle, which I would recommend, then you would just need to do...
$view = $this
->view($this->getRepository()->findAll();)
->setExclusionGroups($this->generateGroups())
;
return $this->handleView($view);
}
private function generateGroups()
{
$securityContext = $this->get('security.context');
$groups = array();
if ($securityContext->isGranted('ROLE_USER')) {
$groups[] = 'user';
}
if ($securityContext->isGranted('ROLE_ADMIN')) {
$groups[] = 'admin';
}
return $groups;
}
Хотя весь "generateGroups" и настройка групп будет лучше размещена в обработчике представлений клиента или генераторе ответов.
Предполагая, что ваша иерархия имеет ROLE_ADMIN
в качестве родителя ROLE_USER
, вы получите следующие результаты.
ROLE_USER
{
"users": [
{
"id": 1,
"userAndAdmin": "val"
}
]
}
ROLE_ADMIN
{
"users": [
{
"id": 1,
"userAndAdmin": "val",
"adminOnly": "val"
}
]
}
Это здорово! Более того, я могу использовать его с аннотациями, и это будет просто, как несколько строк кода. Огромное спасибо! –