modera/backend-module-bundle
A bundle of reusable backend modules for Modera-powered Laravel applications, packaging common admin features like authentication, access control, settings, and CRUD scaffolding so you can assemble a full management panel quickly and consistently.
First, a framework reality check. Despite being evaluated here by a Laravel developer, this is a Symfony bundle (Symfony 2.8–3.x era), not a Laravel package. There is no service provider, no config/*.php, no facade. If you are working in a Laravel codebase you cannot install this — read it as a reference implementation of a "browse and install packages from the admin panel" feature and port the idea, not the code.
If you genuinely are on a Modera/Symfony backend, the minimal path is:
composer require modera/backend-module-bundle (expect dependency conflicts — see Gotchas).new Modera\BackendModuleBundle\ModeraBackendModuleBundle() in AppKernel.Resources/config/routing.xml) under your backend prefix — by convention /backend — so the module browser lands at something like /backend/modules.modera_backend's menu compilation, so the "Modules" item appears in the left nav automatically once the routing + menu tag are wired).Where to look first, in this order:
Resources/config/services.xml — the actual surface area. Service IDs and constructor arguments tell you far more than the README.Controller/ — the HTTP entry points (list, detail, install/uninstall actions).ModuleManager/ModuleRepository-style service backs the controller — that is the single unit you would ever reuse standalone.Resources/translations/ — confirms it is designed to be embedded in a localized admin, and gives you the vocabulary (installed / available / update).First use case: as an admin, open the Modules section, see a catalog of installable Modera modules pulled from a remote/configured source, and click Install to have the bundle added to the project. That is the whole feature. Everything else is chrome.
Inject the manager, not the controller. The only reusable seam is the service that knows "what modules exist" and "what is installed". If you are adapting this for your own stack, keep that boundary: your admin controller should ask a service for a list, never shell out to Composer itself.
getAvailableModules() vs getInstalledModules(), with the view diffing them to decide which button to render. Replicate this split; it keeps the "installed" side cheap (filesystem / composer.lock read) and the "available" side cacheable (remote fetch).NavigationService that collects items from registered "modules" and renders them in a Blade partial — do not edit the layout.composer.json. Wire the permission check in the controller and the menu provider (hide the item if unauthorized), not just the template.composer require, UI polls status. If you keep the synchronous path, at minimum wrap it with an explicit timeout and a lock so two admins cannot install concurrently.Admin\PackageController + PackageRegistry (reads a manifest or Packagist API) + InstallPackage queued job running composer require via Process, status persisted in a package_installs table, UI polling a status endpoint. Same shape, none of this bundle's code.app/ as read-only reference if you want to study it.backend-bundle, security-bundle, translations-bundle, backend tools) plus the Sencha/ExtJS-flavored backend UI. There is no useful subset you can compose into an unrelated app without rewriting it.max_execution_time, PHP memory limits, and proxy timeouts will kill a real install mid-write, leaving composer.json/vendor inconsistent. Always run installs from a CLI worker or queue with a lock file./backend. If your app already uses modules as a path segment, you will silently shadow or be shadowed. Rename the prefix rather than debug the symptom.modera_backend_module.*) and their own translation domain; overriding strings means adding files to app/Resources/ModeraBackendModuleBundle/translations/, not editing vendor files.var/logs/, then the module manager service directly via a one-off console command — reproducing outside HTTP is much faster than clicking through the UI.How can I help you explore Laravel packages today?