As reminder, Groups
in JMSSerializer are used as exclusion strategy.
An exclusion strategy consists to a specific approach used to expose/exclude properties depending on condition/context.
In order to use them correctly, the first thing you have to do is exclude all properties of your entity :
// ...
use JMSSerializerAnnotation as JMS;
/**
* @ORMEntity(repositoryClass="AppBundleRepositoryUserRepository")
* @JMSExclusionPolicy("all")
*/
class User extends BaseUser
Now, you have explicitly expose properties depending on Groups
:
/**
* @ORMColumn(type="string", length=255, nullable=true, unique=false)
* @JMSGroups({"default"}) // Idem for all properties you want render in group "default"
*/
protected $name;
/**
* @ORMColumn(type="string", length=255, nullable=true, unique=false)
* @JMSGroups({"notification"})
*/
protected $deviceId;
Then, you have to define the used Group
in your controller action :
/**
* Get list of Admins
* @AnnotationsGet("/api/v1/admins", name="list_of_admins")
* @AnnotationsView(serializerGroups={"default", "notification"}) // Here set the Group used
* @return FOSRestBundleViewView
*/
public function getAdminsAction()
{
if(!$this->isGranted('ROLE_ADMIN')){
throw new AccessDeniedException('Only for Admin');
}
$admins = $this->getDoctrine()->getRepository('AppBundle:User')->findByRole('ROLE_ADMIN');
return $this->view(['data' => $admins], Codes::HTTP_OK);
}
Now, $admins
contains only the properties exposed to the group default
and notification
.
You can also do it manually instead of use an annotation :
$view = $this->view($admins, 200);
$view->setSerializerGroups(array('default', 'notification'));
return $this->handleView($view);
For more informations, see Exclusion strategies .
I hope it's clear for you.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…