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

Php User Agent Bundle Laravel Package

exs/php-user-agent-bundle

Symfony bundle that wraps donatj/PhpUserAgent. Register EXSPhpUserAgentBundle, then call PhpUserAgentService::parseUserAgent() on a user-agent string to detect platform, browser, and browser version. Simple service-based access with no extra configuration.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. This package is a Symfony 2 bundle, not a Laravel package. That single fact dominates the evaluation: it provides a Bundle class registered via AppKernel::registerBundles(), a convention Laravel has no equivalent for. There is no service provider, no facade, no config publishing, and no illuminate/* constraint in the manifest. A Laravel application cannot install and boot this package the way the README describes, and the one thing a bundle normally buys you — container wiring — is not even used in the documented usage sample, which does new EXS\PhpUserAgentBundle\Services\PhpUserAgentService() directly. Architecturally, the package is a ~1-class namespace wrapper around donatj/PhpUserAgent, which is itself a set of global functions.

Integration feasibility. Effectively low for a Laravel codebase. Three options exist and none are attractive: (1) skip the bundle and depend on donatj/PhpUserAgent directly, reimplementing the four accessor methods — roughly 30 lines of code; (2) pull in a Symfony-bundle compatibility shim for Laravel, adding an unmaintained bridge to wrap a wrapper; (3) if the host project actually is a legacy Symfony 2 app, install as documented — but Symfony 2 has been end-of-life since November 2019. The functional surface is trivial, which cuts both ways: integration is cheap if you accept doing it yourself, and pointless if you route through this package.

Technical risk. High relative to the value delivered. Signals: 1 GitHub star, 0 dependents, a score of 0.005, and a maturity level of "readme" — meaning no tagged release discipline, no CI, no test suite, and no changelog were detected. The public API contains a typo (getFlatform instead of getPlatform) that consumers must code against, which is a permanent wart and a signal of low review rigor. The bundle pins ^1.0 but the underlying donatj/PhpUserAgent is a moving dependency whose own API is global functions, so the wrapper cannot meaningfully insulate you from upstream changes. PHP version constraints are unstated in the excerpt, raising the risk of conflicts with modern PHP 8.x runtimes.

Key questions.

  • Is the target application actually Symfony 2, or was this surfaced for a Laravel codebase? The answer changes this from "risky but installable" to "not applicable."
  • What is the concrete requirement — browser/platform/version detection, or bot detection, or device-type analytics? Only the first is in scope here.
  • Does the business need UA parsing at all, or is this available from the CDN/edge (Cloudflare, Fastly) or from existing analytics already in the stack?
  • Who owns a fork if we adopt, given 0 dependents and no visible maintainer cadence?
  • What is the PHP and framework version matrix for the host application?

Integration Approach

Stack fit. Poor for Laravel, acceptable-but-legacy for Symfony 2. In a Laravel stack the idiomatic answers are jenssegers/agent (Mobile Detect–based, Laravel-native service provider and facade), matomo/device-detector for higher-fidelity parsing, or a thin in-house service around donatj/PhpUserAgent bound in a service provider. Any of these is a better fit than a framework-mismatched bundle. If the environment genuinely is Symfony 2, the bundle fits mechanically but drags in an EOL framework.

Migration path. Recommended path: do not adopt. Instead, add donatj/PhpUserAgent (or the detector library of choice) as a direct Composer dependency, implement a single UserAgentService class exposing platform(), browser(), version(), and isMobile(), and register it as a singleton in a Laravel service provider. This preserves the only real functionality the bundle offers while removing the framework coupling and the typo'd API. If a legacy Symfony 2 service already consumes this bundle, the migration is a mechanical refactor: replace the new-based instantiation with constructor injection of the direct dependency, and alias getFlatform() to getPlatform() at the call sites during the transition to avoid a big-bang rename.

Compatibility. Confirm the host PHP version against the package's composer.json before anything else; a ^1.0 constraint from the Symfony 2 era is likely to declare php: >=5.x and may cap below 8.x, producing solver conflicts. The underlying donatj/PhpUserAgent is the real compatibility surface and is actively maintained, so the practical advice is to depend on it directly and control that constraint yourself. Note also that UA regex libraries are data-driven — the value is in the regex dataset, not the wrapper, so pinning an old wrapper risks running stale detection patterns.

Sequencing. (1) Confirm the framework target and PHP version. (2) Establish whether UA parsing is actually a requirement or already satisfied upstream. (3) If required, spike the direct dependency in a branch behind an interface so the implementation is swappable. (4) Write characterization tests for the handful of UA strings the business cares about — Chrome, Safari/iOS, Android WebView, and one known bot. (5) Wire the service into the container and cut over call sites. (6) Skip the bundle entirely unless the host is Symfony 2, in which case treat adoption as technical debt logged at the same time.

Operational Impact

Maintenance. Near-zero maintenance burden because the package is essentially frozen — but that is a liability, not a virtue. With 1 star, 0 dependents, and readme-level maturity, there is no credible maintainer commitment. You will be the maintainer, either of a fork or of the four-method class you write yourself. The latter is cheaper to own because it has no framework coupling and no inherited typo.

Support. No meaningful support channel. The README points to a marketing agency's contact page, not an issue tracker with triage, and the contributor note is generic boilerplate. In an incident, you cannot escalate; you read the source, which is small enough to do — but that means your on-call engineer is the vendor.

Scaling. UA parsing is CPU-cheap string/regex work, and the cost is dominated by the underlying regex dataset rather than by this wrapper. Two considerations: parse once at request ingress and cache the result on the session or request context rather than re-parsing per call, and be aware that regex-based detection is the part that degrades with large pattern sets. There is no state, no I/O, and no external service, so horizontal scaling is a non-issue. The scaling risk is organizational — a single-maintainer wrapper becomes a bottleneck only if you have forked it and need upstream fixes.

Failure modes.

  • Framework boot failure: installing a Symfony bundle into Laravel yields a class that is never autoloaded or registered, or a container error if a bridge is used; the symptom is a silent no-op rather than a clear error, which is worse.
  • Dependency solver conflict: stale PHP constraints block composer update, forcing an --ignore-platform-reqs workaround that masks real incompatibilities.
  • Stale detection data: the wrapper's pinned upstream version lags new browser versions, producing misclassification — a new Chrome major reporting as "unknown" — which corrupts any analytics or feature-gating built on it.
  • Typo propagation: getFlatform() becomes load-bearing API in your codebase; any future replacement library will not have it, so the rename cost is deferred and compounded.
  • Silent null/empty returns: global-function wrappers typically return empty strings or nulls on unrecognized input rather than throwing, so downstream logic must defensively default.

Ramp-up. Minimal for a competent PHP engineer — the API is four methods and the README is a page. The ramp-up cost is not learning the package, it is the due diligence of discovering the framework mismatch and the maturity signals before it reaches production. Budget roughly a half-day for a spike to confirm the above and produce the direct-dependency replacement; the recommendation is to spend that half-day and then not adopt the bundle.

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.
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels