umanit-pomm/model-manager
UmanIT POMM Model Manager is a Laravel package for managing Eloquent models from a central admin interface, with CRUD scaffolding and configuration helpers to speed up back-office screens. Community adoption and documentation are currently minimal.
Before anything else, confirm what you're actually installing. Despite the "model" in the name, this is a Pomm package (a PostgreSQL object-mapper), not an Eloquent extension. It will not give you Model::find(), relationships, or migrations. Treat it as a query/mapping layer you bolt onto Laravel rather than a drop-in ORM.
composer.json and require it by branch:
"repositories": [{ "type": "vcs", "url": "https://github.com/Umanit-Pomm/ModelManager" }]
composer.json (what Pomm version it pins, PHP constraint, autoload namespace) → README → src/ for the manager class/trait → tests/ for real usage examples. The tests are usually the only trustworthy documentation on a zero-adoption package.config/database.php PostgreSQL DSN and binds it as a singleton. Inject it into a repository class — do not call it from controllers directly.You should have one query returning typed objects through Laravel's container before you consider using it anywhere else.
Read models alongside Eloquent. The most defensible pattern: keep Eloquent for writes, CRUD, and anything touching relationships; use this package for read-only projections and reporting queries. You get PostgreSQL-specific SQL without fighting the query builder, and you don't rewrite your domain layer.
Repository wrapper, not direct use. Bind an interface in a service provider and implement it with the manager. This gives you one seam to swap the package out later — important given the adoption numbers.
interface ReportRepository { public function monthlyTotals(int $year): array; }
final class PommReportRepository implements ReportRepository
{
public function __construct(private ModelManager $manager) {}
public function monthlyTotals(int $year): array
{
// map rows to DTOs here, not in the controller
}
}
Share the connection. Configure the manager to reuse the same PDO/DSN as Laravel's pgsql connection. If they diverge, DB::transaction() will not roll back Pomm writes, and you'll get phantom rows in tests and production.
DTO mapping over arrays. Have the manager return value objects or readonly DTOs. Arrays leak column names into Blade/JSON responses and make schema changes a breaking change.
Query objects for hard SQL. When a query needs LATERAL, recursive CTEs, jsonb_path_query, or window functions, put it in a dedicated class rather than scattering raw SQL through services.
Testing. Use RefreshDatabase to build schema (via Laravel migrations), then query through the bound manager — this validates the SQL against real PostgreSQL. For unit tests, bind a fake implementation of your repository interface; don't mock the manager itself.
extra.laravel provider, no facade, no config publish. You write the service provider and the config array yourself.composer.lock. Budget for forking if it breaks.pomm-project/* version it requires. A stale Pomm pin can conflict with other Postgres tooling in a large app.DB::listen() won't see these queries. Pomm bypasses Laravel's query event pipeline. If you rely on Telescope, query logging, or a slow-query listener for observability, add explicit logging inside your repository wrapper or you'll have a blind spot.with() eager loading. Don't try to bridge them — it becomes a half-ORM that pleases nobody.env() in bindings breaks under config:cache. Read the connection details from config('database.connections.pgsql'), never env() inside a service provider.?/:name builder semantics. Review any query with LIKE, :: casts, or quoted identifiers for surprises.try/catch that rethrows with the SQL attached, and write one integration test per query against a seeded schema.How can I help you explore Laravel packages today?