Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Vendra User Profile Laravel Package

misaf/vendra-user-profile

misaf/vendra-user-profile is a Laravel package for adding user profile management to Vendra applications. It helps organize profile data and integrate user profile features with minimal setup, giving developers a convenient foundation for profile-related workflows.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. This is not a general-purpose profile package; it is a module of the Vendra platform, published as a read-only subtree split of misaf/vendra. Its real architectural value is as a first-party extension point, not as reusable CRUD. The evidence in the skill definition is decisive: relations are registered via User::resolveRelationUsing(...) in the service provider rather than a trait on App\Models\User, tenant awareness is derived implicitly from the bound TenantResolver in misaf/vendra-support with no config toggle, UI is delivered as a Filament v5 plugin, and feature gating runs through Pennant (Features\ModuleEnabled). Two adoption paths therefore exist:

  • On Vendra already: strong fit. You inherit policy/permission enums, the UserProfileRelationManagers registry for optional modules (Address, Phone, Document, Verification), en/de/fa translations, and admin UI placement beside Users — all without reverse dependencies. This is the intended integration and the cheapest.
  • On plain Laravel/Filament: poor value. You would take on a platform slice — support-layer coupling, Pennant, a plugin service provider — to obtain one userProfiles table, a hasOne, and avatar handling. A 60-line migration and a form request would be cheaper to own.

Integration feasibility. Feasible but documentation-led integration will mislead. The supplied Laravel assessment is hedged and generic ("check the README for exact tags, typically…"), which suggests it was reconstructed rather than written by the maintainer. Worse, the two doc sets contradict each other on the public contract: one describes a profiles table, a HasProfile trait, and $user->profile; the other specifies user_profiles, no trait, and relations registered as profiles and userProfiles via resolveRelationUsing. That is not a detail — it determines your migrations, your model, your API resources, and your tests. The first integration task is source verification against composer.json, the service provider, and database/migrations, not documentation reading.

Technical risk.

Risk Severity Rationale
Bus factor / adoption High 1 star, single maintainer, read-only split — no issue tracker or PR flow on this repo; all fixes go upstream to misaf/vendra.
Contract ambiguity High Conflicting table/relation/trait documentation (above).
Implicit tenancy coupling Medium-High Tenancy is inferred from the bound TenantResolver; the module must run with tenancy off, and pre-tenancy installs require vendra-tenant:enable {tenant} to backfill tenant_id.
Version graph alignment Medium self.version alignment across the Vendra package graph; the split's version is not independently meaningful. v1.12.3 is a patch off v1.11.0 but release notes only link a compare view.
Invariant enforcement Medium Exactly one is_default profile per user, enforced by an observer plus a default_user_guard unique index — concurrent writes can surface as exceptions rather than validation errors.
Translatable scope Medium Any field in $translatable must be a JSON column, and the choice propagates to casts, factories, validation, Filament locale UI, API serialization, and tests. Retrofitting this later is a migration, not a config change.

Key questions for the maintainer or your spike.

  1. Which table and which relation name are canonical in the target version — profiles or user_profiles, profile or userProfiles — and is a trait still required on User?
  2. What is the supported Laravel/PHP/Filament/Livewire matrix for v1.12.x, and is Filament v5 mandatory or optional?
  3. Does the User model binding point exist for substituting a custom profile model, and is UserProfileRelationManagers a stable public contract?
  4. What is the upgrade policy across minor versions, and does the monorepo run the same test suite published with the split?
  5. Is there a supported path to add custom fields (own migration vs. JSON meta), and does the package expose it?

Integration Approach

Stack fit. Assume a Laravel 12-era application with Filament v5 for admin surfaces, Pennant for feature flags, Spatie Translatable conventions, and misaf/vendra-support for tenancy. If your admin is not Filament, roughly half the package (resources, clusters, navigation priorities, permission enums) is inert, and you are paying maintenance for UI you do not render. If you are not multi-tenant, the TenantAwareness/BelongsToTenant machinery is harmless but is still a dependency edge you inherit.

Migration path (brownfield). Expect three distinct workstreams, not one:

  1. Schema. Publish/consume migrations and reconcile against any existing profile columns on users or a bespoke table. Decide the backfill: existing rows into user_profiles, and how to elect the single is_default row per user without violating default_user_guard. If the host was migrated before tenancy was enabled, schedule the vendra-tenant:enable backfill as an explicit, monitored step — not an implicit migration.
  2. Authorization. Adopt the policy-enum pattern as the permission source and register the package's policies; add your own policy/gate for any profile endpoints you write. Do not rely on route middleware alone, especially since published routes can collide with existing auth/settings routes — verify with php artisan route:list.
  3. Surface. Register module UI through the module Plugin/ServiceProvider rather than hand-wiring resources into unrelated panel providers, and expose profiles over APIs through a UserResource with conditional loading ($user->load('profile')).

Compatibility. Pin exact versions and treat the split's tag as metadata only; the meaningful version is the monorepo release. Because the split is read-only and MIT, plan for a fork contingency — but a fork breaks self.version alignment across the Vendra graph, so it must be a deliberate, documented decision with an owner.

Sequencing.

  1. One-week spike on a branch: install, verify table/relation/trait reality, confirm Filament and Pennant versions resolve cleanly.
  2. Decide adopt-vs-build on the basis of Vendra presence; document the decision.
  3. Tenancy decision (on/off, backfill needed?) and schema reconciliation.
  4. Backfill + is_default election; contract tests around the unique index.
  5. User relation wiring and authorization/policies.
  6. Filament plugin registration and navigation placement; eager loading in tables.
  7. API resource + serialization; then translatable fields, if any, decided before the schema is locked.
  8. Observability (events/observers for audit) and upgrade runbook.

Operational Impact

Maintenance. Treat the package as owned code. Published config, migrations, and views must live in version control and be diffed after every upgrade so local overrides do not drift from vendor changes; clear cached config (config:clear) after any config change. Every upgrade means reading the monorepo compare view, running the full suite, and checking for migration or config changes — the split's release notes ("Full Changelog" link only) provide no upgrade guidance. Budget a named internal owner; this is not a package you install and forget.

Support. There is no vendor SLA, no meaningful community (1 star), and no issue tracker on the read-only split. Effectively you are supporting it. The mitigating asset is the skills/vendra-user-profile-development documentation, which codifies module boundaries, strict-typing and PHPDoc conventions, test commands (php artisan test --compact --testsuite=vendra-user-profile, composer stan), and translation-parity expectations. That is unusually strong for a package of this size and is the main argument for adoption — but it is a convention set for contributors to the monorepo, not a support contract for integrators.

Scaling. Three concrete pressure points:

  • Reads: profile access inside Blade loops and user listings is the classic N+1; enforce eager loading ($user->load('profile')) and withCount/eager loading in Filament tables and relation managers.
  • Writes: the single-default invariant serializes on default_user_guard; high-concurrency profile changes will surface QueryException and must be handled gracefully, not swallowed.
  • Media: avatar handling requires a configured disk, storage:link, and validation rules; use public visibility only when public access is genuinely required, and route through a CDN before volume grows.

Failure modes to instrument. Silent profile-update failures ($fillable, validation, route model binding, policy denial) are the most common and least visible — log at the update boundary with query logging or Telescope during rollout. Others: duplicate profile creation where updateOrCreate was not used; multiple defaults under race; tenant_id leakage or null ownership when tenancy is toggled; published-route conflicts after upgrades; stale config cache; missing translation keys after adding locales.

Ramp-up. A Laravel-competent engineer reaches productivity on the profile domain in roughly 3–5 days, but only if they already understand the host platform: TenantResolver semantics, TenantTableRegistry, Filament v5 namespaces (Filament\Forms\Components vs Filament\Schemas\Components), plugin discovery, and Pennant's before() global-switch ordering. Absent that platform fluency, add one to two weeks. The skills documents are a reasonable onboarding path — assign them as required reading and have the first task be the source-verification spike described above, so the team resolves the documentation contradictions once, centrally, rather than in each feature branch.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
frankyso/ipaymu
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
diephp/sequences
users-au/socialite-provider
twidpay/twid-logger
mrnewport/laravel-plaid
mrnewport/laravel-repo
mrnewport/laravel-docsign
mrnewport/laravel-stow
mrnewport/laravel-flow
mrnewport/laravel-priceable
mrnewport/laravel-nestedterms
fredmeng/laravel-apidoc-generator