adrenalinkin/visualize-entity-bundle
Symfony bundle to visualize entity data using YAML configuration. Define entity classes and fields to display, then build a view object via the linkin_visualize_entity.builder service in controllers. Includes docs and examples for visualize_entity.yml setup.
Installation
composer require adrenalinkin/visualize-entity-bundle
Ensure your project uses Symfony 3.x/4.x (based on AppKernel.php reference).
Enable Bundle
Add to app/AppKernel.php (Symfony 3.x) or config/bundles.php (Symfony 4.x+):
new Linkin\Bundle\VisualizeEntityBundle\LinkinVisualizeEntityBundle(),
First Configuration
Create a YAML file (e.g., config/packages/linkin_visualize_entity.yaml):
linkin_visualize_entity:
acme_user_default:
className: App\Entity\User
fields:
id: ~
email: ~
createdAt: { format: "Y-m-d H:i:s" }
First Usage Inject the service in a controller/service:
use Linkin\Bundle\VisualizeEntityBundle\Service\VisualizeEntityService;
public function __construct(private VisualizeEntityService $visualizeService) {}
public function showUser(User $user) {
$visualized = $this->visualizeService->visualize('acme_user_default', $user);
return $this->render('user/show.html.twig', ['data' => $visualized]);
}
Use inline formatting in YAML for complex transformations:
fields:
fullName: { template: "{{ entity.firstName }} {{ entity.lastName }}" }
status: { formatter: "App\Formatter\StatusFormatter" }
Extend base configurations for child entities:
acme_user_admin:
extends: acme_user_default
fields:
roles: ~
Render visualized data directly in templates:
{% for field, value in visualizedData %}
<tr>
<th>{{ field }}</th>
<td>{{ value|raw }}</td>
</tr>
{% endfor %}
Use the service to format entity arrays for JSON APIs:
$users = $this->userRepository->findAll();
$visualized = $this->visualizeService->batchVisualize('acme_user_default', $users);
return $this->json($visualized);
Trigger visualization in event subscribers:
public function onUserCreated(UserCreatedEvent $event) {
$visualized = $this->visualizeService->visualize('acme_user_default', $event->getUser());
// Log, notify, or store $visualized
}
Use visualized data to pre-populate forms:
$form = $this->createForm(UserType::class, $user);
$form->add('customData', TextType::class, [
'data' => $this->visualizeService->visualize('acme_user_default', $user)['customField'] ?? null,
]);
Visualize entities before/after flush:
public function prePersist(EntityManagerInterface $em, User $user) {
$visualized = $this->visualizeService->visualize('acme_user_default', $user);
// Validate or log $visualized
}
Create custom commands to export visualized data:
$users = $this->userRepository->findBy(['active' => true]);
$visualized = $this->visualizeService->batchVisualize('acme_user_default', $users);
$this->output->writeln(json_encode($visualized));
Circular References
User <-> Post) may cause infinite loops.maxDepth in config or implement VisualizeEntityInterface to control traversal:
acme_user_default:
maxDepth: 2
Missing Dependencies
adrenalinkin/entity-helper-bundle (not explicitly mentioned in README).composer require adrenalinkin/entity-helper-bundle
YAML Parsing Errors
yaml-lint config/packages/linkin_visualize_entity.yaml
Performance with Large Datasets
batchVisualize() may be slow for >1000 entities.chunk() or implement lazy loading:
$visualized = [];
foreach ($this->userRepository->findAll() as $user) {
$visualized[] = $this->visualizeService->visualize('acme_user_default', $user);
}
Enable Debug Mode
Add to config/packages/dev/linkin_visualize_entity.yaml:
debug: true
Logs raw visualization data to var/log/dev.log.
Check Configuration Loading Dump loaded configs in a controller:
dump($this->visualizeService->getConfigManager()->getConfigs());
Formatter Errors If a custom formatter fails, check:
linkin.visualize.formatter.Linkin\Bundle\VisualizeEntityBundle\Formatter\FormatterInterface.Custom Formatters Create a formatter class:
use Linkin\Bundle\VisualizeEntityBundle\Formatter\FormatterInterface;
class DateRangeFormatter implements FormatterInterface {
public function format($value, array $options) {
return date('Y-m-d', strtotime($value)) . ' to ' . date('Y-m-d', strtotime($value) + 86400);
}
}
Register as a service:
services:
App\Formatter\DateRangeFormatter:
tags:
- { name: linkin.visualize.formatter, alias: date_range }
Dynamic Config Loading
Override ConfigManager to load configs from a database or API:
$this->visualizeService->setConfigManager(new CustomConfigManager());
Twig Extensions Add a Twig function for direct template usage:
$twig->addFunction(new \Twig\TwigFunction('visualize_entity', [
$this->visualizeService, 'visualize'
]));
Usage in Twig:
{{ visualize_entity('acme_user_default', user) }}
Event Listeners Extend visualization logic via events:
$dispatcher->addListener(
Linkin\Bundle\VisualizeEntityBundle\Event\PreVisualizeEvent::class,
function (PreVisualizeEvent $event) {
if ($event->getEntity() instanceof User) {
$event->addData('customField', 'dynamic_value');
}
}
);
How can I help you explore Laravel packages today?