knplabs/rad-bundle
KnpRadBundle is a Symfony bundle for rapid application development, offering CRUD generators, admin scaffolding, and sensible conventions that cut boilerplate and help you build common features faster.
Reality check first: knplabs/rad-bundle is a Symfony 2 bundle, archived, last tagged in September 2015, and explicitly unmaintained. It has zero dependents and no Laravel integration path — there is no service provider, no facade, no Composer constraint that will resolve cleanly against a modern Laravel app. You cannot composer require this into a Laravel project and expect it to boot. So "getting started" for a Laravel developer means one of two things:
knplabs/rad-bundle at its last release, register Knp\Bundle\RadBundle\KnpRadBundle in AppKernel, and follow the bundle's app/-centric layout. Treat it as a museum piece — no production use, no security patches.Where to look first (as a Laravel dev):
README.md for the feature list — it reads like a checklist of what Laravel already gives you (generators, convention-over-configuration, annotation routing).Command/ directory) — this is the closest analogue to php artisan make:*, and the most directly portable idea.DependencyInjection/ and Configuration.php files — useful as a reference for how bundles expose config trees; compare with Laravel's config/*.php + mergeConfigFrom.AppKernel / app-directory conventions — compare against bootstrap/app.php and Laravel 11's slim skeleton.First use case (ported): replace a repetitive "create model + form + controller + route" workflow in Laravel with a single artisan make:feature command. That's the actual value you can extract from this bundle in 2024.
Since direct integration is off the table, the practical patterns are translation patterns — how the RAD ideas in this bundle map onto Laravel.
RadBundle's headline feature was opinionated scaffolding. The Laravel equivalent is a custom generator command:
// app/Console/Commands/MakeFeatureCommand.php
class MakeFeatureCommand extends GeneratorCommand
{
protected $signature = 'make:feature {name}';
protected $type = 'Feature';
protected function getStub() { return base_path('stubs/feature.stub'); }
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Features';
}
}
Stub out model + migration + form request + controller + resource route in one go; that is the RadBundle philosophy applied.
RadBundle guessed form types from entities/validation metadata. Laravel's native answer is FormRequest with rules(), plus Rule:: objects. If you want to go further, derive rules from a schema:
// app/Support/RulesFromSchema.php
public static function for(string $table): array
{
return collect(Schema::getColumns($table))
->mapWithKeys(fn ($c) => [$c['name'] => $c['nullable'] ? ['nullable'] : ['required']])
->all();
}
That's the "guess the form from the model" idea, expressed idiomatically.
RadBundle leaned on annotation-based routing. Laravel 11's Route::controller(...) and PHP-attribute patterns give you the same ergonomics — the equivalent file is routes/web.php plus Route::resource.
The bundle's simplification of Symfony's app/ folder is conceptually the same move as Laravel's app/Features/* or app/Domain/* structure. If you like RadBundle's "everything for a feature lives together," that's the pattern to copy.
Symfony's container auto-wiring mirrors Laravel's container resolution. If you're porting RadBundle-style controllers, keep them constructor-injected and rely on Laravel's binding rather than facades — it's the pattern the bundle was designed around.
knplabs/rad-bundle to a Laravel composer.json. It pulls in Symfony 2 components that conflict with Laravel's Symfony 7 deps.symfony/maker-bundle (the direct successor in spirit) and Laravel's own artisan make:*.symfony/maker-bundle, sensio/framework-extra-bundle for annotations, and Symfony Flex recipes for structure.~2.x) are incompatible with modern Laravel (Symfony 6/7). Composer will either refuse to resolve or pull a decade-old dependency tree.knplabs/knp-paginator-bundle, knplabs/knp-menu, knplabs/knp-snappy are still alive; rad-bundle is not.AppKernel::registerBundles() entry or the app/config/config.yml import ordering — RadBundle expected a specific load order.app/cache before rerunning.sensio/framework-extra-bundle is registered before RadBundle.Command/ classes are the most valuable part; they show what a 2015-era team considered boilerplate, and that list is still roughly accurate today.Configuration.php tree is a good example of how to design a bundle/package config — useful if you're writing a Laravel package and want a clean config/yourpackage.php contract.artisan and package discovery.DependencyInjection/Configuration.php is a clean way to expose opinions without locking users out. It's the same philosophy Laravel uses for config/app.php defaults.How can I help you explore Laravel packages today?