imatic/user-bundle
Imatic User Bundle is a Symfony package for adding user accounts to your application. It provides configurable user entities, authentication integration, and reusable services for managing users and access control, helping teams ship account features with minimal setup and consistent structure.
First, the ecosystem check. Despite the framing, imatic/user-bundle is a Symfony bundle, not a Laravel package. There is no service provider, no config/user-bundle.php to publish, and no facade. If you are in a Laravel codebase, composer require imatic/user-bundle will pull in symfony/* components you will never boot, and nothing will auto-register. Treat this as "read it as reference material or port the domain code," not "install and go."
Where to look first, in order:
composer.json — the require block tells you the supported Symfony major version and whether Doctrine ORM/ODM is mandatory. This single file answers "can I even install this on my stack?"README.md — for a 2-star bundle this is usually the entire documentation surface. Expect a short install snippet and a config sample, not a tutorial.src/ImaticUserBundle.php) plus DependencyInjection/Configuration.php — the config tree is the real API contract. Read it before the README; it is more accurate.Entity/ or Model/ — a user bundle's value is almost entirely in whether it ships a base User you extend, a MappedSuperclass, or just interfaces.Resources/config/services.* — reveals the service IDs and whether there is a UserManager abstraction worth injecting.First use case (Symfony app): register the bundle in config/bundles.php, add an imatic_user: block matching the config tree, point your security.yaml provider at whatever user class the bundle expects, and stand up a single login + password-reset flow. Do not adopt the whole bundle at once — prove the user entity and the firewall provider work together before touching registration or profile editing.
Entity extension over entity replacement. Most Symfony user bundles expect you to create your own App\Entity\User that either extends a bundle base class or implements UserInterface + PasswordAuthenticatedUserInterface while reusing the bundle's traits/fields. Follow that shape rather than fighting it — it keeps your schema in your migrations where you can review it.
Inject the manager, not the repository. If the bundle exposes a user manager service, depend on it in your controllers and form handlers instead of reaching into EntityManager directly. That indirection is the only thing that makes the bundle swappable later, and given the maintenance signals it is worth preserving.
Wire security explicitly. Configure the provider by entity class and set the password hasher for your concrete user class in security.yaml. Do not rely on the bundle to guess; explicit providers: and password_hashers: entries are the difference between a working firewall and a UserNotFoundException at 2am.
Build your own controllers. For a package this small, expect it to ship services and entities but not a complete registration/reset UX. The productive pattern is: bundle handles user persistence and password lifecycle, your app owns routes, forms, validation, and emails. That split also means a future fork or replacement is a service-level swap, not a rewrite.
Porting to Laravel. If you genuinely want the behavior in a Laravel app, translate rather than bridge: take the field set and password-update logic, reimplement as an Eloquent model with Hash::make / Hash::check, and drop the Symfony wiring. There is no supported path to running a Symfony bundle's DI container inside Laravel.
Testing. Write one functional test that authenticates through the real firewall with a fixture user, and unit tests around any manager methods you call. The functional test is what catches config drift when you upgrade Symfony.
composer.json, and assume you may be the maintainer. Fork it if you depend on it for anything auth-adjacent.symfony/* requirements against your app. A bundle written for 4.4/5.x will often "install" against 6/7 and then fail at container compile time on removed aliases or deprecated method signatures.MappedSuperclass, decide early who owns the table. Mixed ownership is how you get a production migration that drops a column you added.encoder/salt concepts. Confirm it targets password_hashers and that rehashing on login is handled, or you will carry weak hashes forward indefinitely.bin/console debug:config imatic_user, debug:container --tag=..., and debug:router will resolve most "why isn't my config taking effect" questions faster than reading source.templates/bundles/ImaticUserBundle/, and use service decoration (App\Service\DecoratingUserManager) to change behavior. Reserve forking for actual bugs.How can I help you explore Laravel packages today?