pirulug/crud-generator
Pirulug CRUD Generator scaffolds full Laravel CRUD interfaces from your existing models and database tables, generating controllers, routes, views, and forms so you can skip repetitive boilerplate and start building features faster.
Requirements first: v2.0.0 targets PHP 8.2+ and Laravel 10.x+, with official support declared for 12.x and 13.x. Check your composer.json constraints before upgrading—if you're on Laravel 11 you're outside the explicitly tested matrix, so pin the package version and smoke-test the generator rather than assuming parity.
Install and publish:
composer require <vendor>/<package>
php artisan vendor:publish --tag=crud-lang
php artisan vendor:publish # inspect the interactive list for config/stub/view tags
The release notes call out crud-lang explicitly and mention "improved publishing tags" generally—run php artisan vendor:publish without arguments once to see the authoritative tag list for your installed version rather than guessing tag names from docs.
Where to look first: the package config file (publish it into config/ and commit it), then the published stubs directory. The stubs are the real API surface of a generator—everything the package produces is editable text, so read them before reading the source.
Confirm the command signature: php artisan list (filter for the package namespace) before your first run. Generator command signatures are the most common thing to drift between major versions.
First use case: scaffold one small, non-critical model end-to-end—migration → Eloquent model → generate the CRUD → open the generated controller, request/validation, and views → run it in the browser. Do this on a throwaway branch. The goal of the first run is not the feature, it's calibrating how much of the output you'd actually keep.
--force).$fillable), then generate. The generator infers validation from column names and types, so a well-specified schema produces better rules than editing rules after the fact.email, integer, numeric, uuid, and date. Treat that as a lint, not a spec—layer in unique:, exists:, max:, nullable, and confirmed by hand.$this->authorize() / policies against the bound instance, and let 404s come from the binding. If your app uses UUIDs or slugs, set getRouteKeyName() on the model so generated show/edit/update/destroy methods work unchanged.toArray() makes the generator viable for JSON endpoints, not just Blade. Generate, then move the toArray() body into a dedicated Resource class if you need conditional relationships or per-endpoint shaping—don't let one toArray() serve both an index and a detail endpoint.crud-lang, set app.locale, and add your own locale files alongside en/es rather than editing the shipped ones. Generated stubs should reference translation keys—if you find hardcoded English in generated views/controllers, that's a stub customization worth making once and committing.npm run dev) to be useful.vendor:publish on an existing target either no-ops or prompts depending on tag and flags; --force will destroy local stub customizations. Always publish to a scratch path first, or keep stubs under version control so the diff is visible.{id} route parameters, or controllers doing manual findOrFail($id), new scaffolds will look different. Standardize a direction and note it in your conventions doc.string length, nullable-ness, foreign keys, enum constraints, and uniqueness. A uuid column will get a uuid rule, but you still need exists: when it's a foreign key, and the model still needs $keyType = 'string' / $incrementing = false. Date detection gives you date where you may want date_format:Y-m-d or after_or_equal:today.set -e / exit-code checks.composer why-not before upgrading Laravel, and re-run your generator smoke test after every framework bump—GeneratorCommand version handling was refactored and is exactly the kind of code that's sensitive to framework internals.config('...') after config:clear), and verify column types are what you think—doctrine/dbal-free type introspection can report string for columns you expect to be typed.How can I help you explore Laravel packages today?