AbstractWidget, enabling teams to build domain-specific widgets (e.g., analytics, KPIs, workflows) without tight coupling to the core bundle.make:command, FormBuilder, and UX/Chartjs). Minimal Laravel-specific adjustments needed (e.g., service container binding, route handling).widgets table (migration provided), but schema is simple (ID, user/role associations, JSON config). No complex joins or constraints.Form, Security, and Cache components—common in Laravel. Potential conflict with Laravel’s native auth if using Symfony’s Security bundle.routes.yaml), but requires manual setup. Static dashboard mode simplifies deployment for read-only use cases.KernelEvents). Laravel’s event system is compatible but requires aliasing.symfony/ux-chartjs (v2+). Laravel users must install this separately and ensure compatibility with their ChartJS version.StaticWidgetProviderInterface, adding boilerplate for fixed dashboards.Auth::user() vs. Symfony’s security->getUser())?ROLE_DASHBOARD_POST_IT) mapped to Laravel’s gate/policy system?resources/views)?ChoiceType) styled in Laravel’s Blade/Tailwind context?routes.yaml with Laravel’s Route::group() or web.php.AppServiceProvider (e.g., StaticWidgetProvider).spatie/laravel-twig) or integrate Twig templates via Blade directives.FormBuilder with Laravel’s Form facade or use a bridge like symfony/form in Laravel.CacheInterface) to use Laravel’s cache drivers.symfony/ux-chartjs (for chart widgets), symfony/form, symfony/security (if using roles).doctrine/orm (if using Doctrine migrations; Laravel’s migrations work too).chart.js and symfony/ux-chartjs JS bundles.composer require 2lenet/dashboard2-bundle symfony/ux-chartjs.AppServiceProvider:
public function register(): void
{
$this->app->register(Lle\DashboardBundle\DashboardBundle::class);
}
routes/web.php:
Route::prefix('dashboard')->group(function () {
Route::resource('widgets', \Lle\DashboardBundle\Controller\WidgetController::class);
// Static dashboard route
Route::get('/static', [\Lle\DashboardBundle\Controller\StaticDashboardController::class, 'staticDashboard']);
});
php artisan make:migration CreateWidgetsTable --table=widgets
(Copy schema from bundle’s migration or use Doctrine’s migration tool.)php artisan migrate
php artisan vendor:publish --tag=lle-dashboard-config.config/services.php or config/dashboard.php.StaticWidgetProviderInterface:
class AppStaticWidgetProvider implements StaticWidgetProviderInterface {
public function getMyWidgets(): array { ... }
public function getWidget(string $index): ?WidgetTypeInterface { ... }
}
AppServiceProvider:
$this->app->bind(StaticWidgetProviderInterface::class, AppStaticWidgetProvider::class);
ContainerInterface with Laravel’s Container (automatic via service provider).Auth facade instead of Symfony’s security where possible (e.g., Auth::user()).Form facade with a Symfony form bridge, orFormBuilder and render forms manually in Twig.resources/views:
Twig::getEnvironment()->setLoader(new FilesystemLoader([app_path('Resources/views')]));
@twig('widget/base_widget.html.twig')).// resources/js/app.js
import 'bootstrap';
import 'chart.js/auto';
import 'symfony/ux-chartjs';
php artisan vendor:publish --tag=lle-dashboard-assets
StaticWidgetProvider for fixed dashboards.How can I help you explore Laravel packages today?