koff/crud-maker-bundle
Koff CRUD Maker Bundle is a Laravel package that scaffolds complete CRUD interfaces from your models, generating controllers, routes, views, and forms automatically so you can build admin panels and data management screens faster with far less boilerplate code.
First, a calibration note: koff/crud-maker-bundle is a Symfony Flex bundle, not a Laravel package. There is no service provider, no config/crud-maker.php, and it will not install into a Laravel app. As a Laravel developer, the realistic way to "leverage" this day-to-day is twofold: (a) if you maintain a legacy Symfony 3.4/4.x service, use it there; (b) in Laravel work, treat it as a reference implementation for what a scaffold generator should emit, and reach for Laravel-native equivalents instead.
Minimal steps if you are in a Symfony codebase that still matches its era:
composer require --dev koff/crud-maker-bundle — it is a code generator, so it belongs in require-dev, never production.config/bundles.php (Flex auto-registers if a recipe exists; for a 2018 bundle it may not, so check and add it manually), or in app/AppKernel.php on Symfony 3.bin/console list make (or list | grep crud) and look for the bundle's make:crud-style command.Where to look first, in order: the README's usage block for the exact command signature and its arguments; the bundle's Command/ directory to see what questions it asks interactively; and the skeleton/template directory it copies from, because that is the only thing that determines the output shape. If the README's command doesn't exist in bin/console list, the bundle is not registered or the command name differs from the docs — verify there before assuming a bug.
The canonical first use case: you have a simple Doctrine entity (say Product with a handful of scalar fields) and you want a list/detail/create/edit/delete flow with a form and templates in under a minute. That is the entire value proposition — one command, boilerplate out.
Generator, not a runtime dependency. Nothing in this bundle should end up on the request path. It writes files into your src/ and templates/ and then gets out of the way. Treat the generated code as owned-by-you the moment it lands.
Entity-first workflow. The pattern is: bin/console make:entity (or hand-write the entity) → configure relations and validation → then run the CRUD maker → then hand-edit. Running the generator before the entity is stable wastes the run, because re-running after schema changes tends to either skip existing files or clobber them depending on the version — neither is what you want mid-refactor.
Generate on a branch, review as a diff. Because the output is a multi-file drop, the honest workflow is git checkout -b crud/product, generate, then git diff and read every file. Generated controllers from this era are frequently under-validated and over-permissive; the diff review is where you catch a missing isGranted or a findAll() that should be paginated.
Adapt, don't extend. There is no meaningful extension point to hook into at runtime. Customization happens by editing generated files directly or by copying the bundle's skeleton directory into your own project and pointing your own tooling at it. If you find yourself wanting to "configure" the generator, you actually want a fork.
Laravel translation of the pattern. If the goal is speed on a Laravel project, the equivalents are php artisan make:model -mcr plus a form-request and a Blade scaffold, or a generator package in the infyom/laravel-generator / bosnadev family. The shape is identical: an entity definition drives controller + validation + views. Reading this bundle's generator is genuinely useful for deciding what your own team's scaffold should produce — resource controller, FormRequest, policy, factory, index/show/create/edit views, and a test stub — but the code itself is not portable.
Integration tip for co-existence. In a Symfony app also running API Platform or EasyAdmin, do not let a scaffold generator and a runtime admin generator both claim the same entity. Pick one per entity, or you get two conflicting route sets for /product. Name-prefix the generated routes.
Last release 2018-03-14, 3 stars, 0 dependents — this is effectively abandoned. That date places it in the Symfony 4.0/4.1 window and PHP 7.1/7.2. It will not install cleanly on Symfony 5, 6, or 7: expect composer conflicts on symfony/framework-bundle, removed KernelInterface methods, and Twig template syntax that assumes pre-2.7 conventions. Budget for a fork-and-patch, not a composer require.
Zero dependents means zero field-testing. Whatever the README claims, the happy path is the only path anyone has likely exercised. Try it on a throwaway entity in a scratch branch before pointing it at a real domain model.
Overwrite semantics are undocumented and version-dependent. Before a second run, check whether the generator uses file_put_contents unconditionally or guards on file_exists. A silent overwrite of a hand-edited controller is the most expensive failure mode here. Commit before every re-run — that is the entire mitigation.
Registration failures masquerade as "the command doesn't exist." If bin/console doesn't list the maker command, the cause is almost always a missing config/bundles.php entry or a stale var/cache — run bin/console cache:clear before debugging the bundle's internals.
Namespace and directory assumptions. Bundles from this vintage often hardcode AppBundle\ or src/AppBundle/ paths. On a modern App\ + src/ layout the generated files land in the wrong namespace and autoloading breaks in a way that looks like a routing bug. Grep the command class for hardcoded path strings before the first run.
Generated code is a security sketch, not a review. Scaffold output typically includes full CRUD routes with no authorization checks and mass-assignment of whatever the form maps. Treat every generated controller action as unauthenticated until you've added the voter/policy equivalent, and every generated form as accepting all entity fields until you've pruned it.
Debugging approach. Run the command with -v/-vvv to see the file paths it writes and the questions it defaults; the interactive defaults are where surprises hide. If output is generated but the page 500s, the fault is almost always namespace mismatch, a Twig block name that doesn't exist in your base layout, or a route name collision — check those three before reading the bundle source.
The realistic verdict. Do not add this to a new project. Its value to a Laravel developer is as a 200-line case study in what a CRUD scaffold should emit, and as a reminder that scaffold generators age badly unless the templates live in your own repo, versioned with the framework they target.
How can I help you explore Laravel packages today?