splash/widgets-bundle
splash/widgets-bundle provides a set of reusable widgets for PHP applications, offering a simple way to register, configure, and render prebuilt UI components in your templates while keeping widget logic centralized and reducing repetitive view code.
This is a Symfony bundle, not a Laravel package. Before you composer require anything, confirm the project you're working in is a Symfony app (or a hybrid where Symfony components are bootstrapped alongside Laravel). If you're purely in Laravel, treat this as a reference implementation to port rather than a drop-in dependency.
Install
composer require splash/widgets-bundle
Then enable it in config/bundles.php (Flex) or your kernel:
BadPixxel\WidgetsBundle\BadPixxelWidgetsBundle::class => ['all' => true],
(Verify the exact class name from the bundle's src/ — the repo's namespace is the source of truth.)
Look here first
src/ — the abstract widget base class and any renderer/collection service. This tells you the contract you extend.Resources/config/services.yaml (or config/) — service tags and the renderer service id.Resources/views/ — the default Twig templates you'll override for styling.First use case: a dashboard "info box" Create one concrete widget class (title, icon, value, colour), register it, render it on a page, and confirm it appears. Do not start by building five widgets — get one end-to-end render working first, because registration/tagging is where this bundle will bite you.
_instanceof autoconfiguration to tag every subclass of the base widget:
_instanceof:
BadPixxel\WidgetsBundle\Widget\AbstractWidget:
tags: ['splash.widget']
{{ render_widget('sales_kpi', {...}) }}) is the ergonomic path — but confirm the extension is enabled, since it may be optional.config/widgets.php. Porting to Laravel means re-implementing the renderer as a singleton, converting service tags to a container binding, and rewriting Twig templates as Blade. Budget for that if you're Laravel-only.composer.json, commit the lockfile, and be prepared to fork. Check the bundle's composer.json for the Symfony and PHP version constraints before assuming it installs on a modern stack.bin/console debug:container --tag=<the-tag>. Usually it's a missing tag, a class outside the autoconfigured namespace, or a stale cache after registering.bin/console cache:clear after adding or renaming a widget; collections are frequently compiled.templates/bundles/<BundleName>/...) rather than editing vendor/. Vendor edits vanish on the next composer update.App\Widget\BaseWidget extending the package's abstract class, standardising colours, spacing, and the template path. Every widget then extends yours, so swapping out the package later is a one-file change instead of twenty.How can I help you explore Laravel packages today?