Skip to content
Snippets Groups Projects

Add support for filtering out response attributes to reduce payload size

4 files
+ 100
3
Compare changes
  • Side-by-side
  • Inline
Files
4
@@ -71,7 +71,7 @@ final class MenuItemsResource extends ResourceBase {
@@ -71,7 +71,7 @@ final class MenuItemsResource extends ResourceBase {
];
];
$tree = $menu_tree->transform($tree, $manipulators);
$tree = $menu_tree->transform($tree, $manipulators);
$this->getMenuItems($tree, $this->menuItems, $cacheability);
$this->getMenuItems($request, $tree, $this->menuItems, $cacheability);
$data = new ResourceObjectData($this->menuItems);
$data = new ResourceObjectData($this->menuItems);
$response = $this->createJsonapiResponse($data, $request, 200, [] /* , $pagination_links */);
$response = $this->createJsonapiResponse($data, $request, 200, [] /* , $pagination_links */);
@@ -142,6 +142,8 @@ final class MenuItemsResource extends ResourceBase {
@@ -142,6 +142,8 @@ final class MenuItemsResource extends ResourceBase {
/**
/**
* Generate the menu items.
* Generate the menu items.
*
*
 
* @param \Symfony\Component\HttpFoundation\Request $request
 
* The request.
* @param array $tree
* @param array $tree
* The menu tree.
* The menu tree.
* @param array $items
* @param array $items
@@ -149,7 +151,7 @@ final class MenuItemsResource extends ResourceBase {
@@ -149,7 +151,7 @@ final class MenuItemsResource extends ResourceBase {
* @param \Drupal\Core\Cache\CacheableMetadata $cache
* @param \Drupal\Core\Cache\CacheableMetadata $cache
* The cacheable metadata.
* The cacheable metadata.
*/
*/
protected function getMenuItems(array $tree, array &$items, CacheableMetadata $cache) {
protected function getMenuItems(Request $request, array $tree, array &$items, CacheableMetadata $cache) {
foreach ($tree as $menu_link) {
foreach ($tree as $menu_link) {
if ($menu_link->access !== NULL && !$menu_link->access instanceof AccessResultInterface) {
if ($menu_link->access !== NULL && !$menu_link->access instanceof AccessResultInterface) {
throw new \DomainException('MenuLinkTreeElement::access must be either NULL or an AccessResultInterface object.');
throw new \DomainException('MenuLinkTreeElement::access must be either NULL or an AccessResultInterface object.');
@@ -198,6 +200,14 @@ final class MenuItemsResource extends ResourceBase {
@@ -198,6 +200,14 @@ final class MenuItemsResource extends ResourceBase {
'url' => $url->getGeneratedUrl(),
'url' => $url->getGeneratedUrl(),
'weight' => (int) $menu_link->link->getWeight(),
'weight' => (int) $menu_link->link->getWeight(),
];
];
 
 
// Apply field filter if required on each field
 
foreach ($fields as $field_name => $field) {
 
if (!$this->checkFieldPresence($request, $field_name)) {
 
unset($fields[$field_name]);
 
}
 
}
 
$links = new LinkCollection([]);
$links = new LinkCollection([]);
$resource_object_cacheability = new CacheableMetadata();
$resource_object_cacheability = new CacheableMetadata();
@@ -206,9 +216,38 @@ final class MenuItemsResource extends ResourceBase {
@@ -206,9 +216,38 @@ final class MenuItemsResource extends ResourceBase {
$items[$id] = new ResourceObject($resource_object_cacheability, $resource_type, $id, NULL, $fields, $links);
$items[$id] = new ResourceObject($resource_object_cacheability, $resource_type, $id, NULL, $fields, $links);
if ($menu_link->subtree) {
if ($menu_link->subtree) {
$this->getMenuItems($menu_link->subtree, $items, $cache);
$this->getMenuItems($request, $menu_link->subtree, $items, $cache);
}
}
}
}
}
}
 
/**
 
* Check the request object to see if we need to return a specific field.
 
*
 
* @param \Symfony\Component\HttpFoundation\Request $request
 
* The request.
 
* @param string $field_name
 
* The field to check.
 
*
 
* @return bool
 
* Return true if we are including the field in results.
 
*/
 
private function checkFieldPresence(Request $request, string $field_name): bool {
 
if (!$request->query->has('filter') ) {
 
return true;
 
}
 
 
$filters = $request->query->all('filter');
 
if (empty($filters['fields'])) {
 
return true;
 
}
 
 
$requested_fields = explode(',', preg_replace("/\s+/", "", $filters['fields']));
 
if (in_array($field_name, $requested_fields)) {
 
return true;
 
}
 
 
return false;
 
}
 
}
}
Loading