Skip to main content
Version: 2026.2

Data Resolver

The data resolver fetches the actual content displayed inside a widget at runtime. When the frontend requests widget data, the bundle looks up the resolver for the widget's type and calls resolveData().

Interface

namespace Pimcore\Bundle\StudioDashboardsBundle\Resolver\Widget;

use Pimcore\Bundle\StudioDashboardsBundle\Schema\Widget\WidgetConfig;

interface DataResolverInterface
{
public function getSupportedWidgetType(): string;

public function resolveData(WidgetConfig $widget): mixed;
}
MethodPurpose
getSupportedWidgetType()Must return the same type identifier as the matching repository and hydrator
resolveData()Returns the data payload for the widget; the return type is passed directly to the API response

Example

The resolver receives the fully hydrated WidgetConfig DTO, so it has access to all stored configuration fields (e.g. element type, page size, selected report ID).

namespace App\Widget\Resolver;

use Pimcore\Bundle\StudioDashboardsBundle\Resolver\Widget\DataResolverInterface;
use Pimcore\Bundle\StudioDashboardsBundle\Schema\Widget\WidgetConfig;
use Pimcore\Bundle\StudioDashboardsBundle\Service\Loader\Widget\TaggedIteratorDataResolver;
use Pimcore\Model\Asset;
use Symfony\Component\DependencyInjection\Attribute\AutoconfigureTag;

#[AutoconfigureTag(TaggedIteratorDataResolver::RESOLVER_TAG)]
final class TopAssetsResolver implements DataResolverInterface
{
public function getSupportedWidgetType(): string
{
return 'top_assets';
}

public function resolveData(WidgetConfig $widget): mixed
{
$list = new Asset\Listing();
$list->setOrderKey('modificationDate');
$list->setOrder('DESC');
$list->setLimit(10);

return array_map(
static fn (Asset $asset) => [
'id' => $asset->getId(),
'filename' => $asset->getFilename(),
'path' => $asset->getFullPath(),
],
$list->load()
);
}
}

The #[AutoconfigureTag(TaggedIteratorDataResolver::RESOLVER_TAG)] attribute registers the class with the tagged-iterator loader automatically.

Permissions

If the widget data requires specific Pimcore user permissions, declare them in the ConfigRepositoryInterface::getRequiredPermissions() method of the matching repository. The bundle checks them before calling resolveData() and returns a 403 response if permissions are missing.