Weave Code
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
Object Routing

Object Routing Laravel Package

jms/object-routing

jms/object-routing is a PHP library for routing based on object state rather than URLs. Define routes and generate targets by evaluating objects and their metadata, enabling flexible navigation and link generation in domain-driven apps.

View on GitHub
Deep Wiki
Context7

Library for generating routes based on objects.

Frequently asked questions about Object Routing
How does object-based routing work in Laravel with jms/object-routing?
Instead of defining routes like `Route::get('/users/{id}', ...)`, you map routes to objects (e.g., `User@id=123`). The library evaluates object properties and metadata to generate URLs dynamically. This is useful for polymorphic resources or CMS-driven navigation where URLs aren’t static. You’ll need to register the router manually in Laravel’s `RouteServiceProvider` or middleware.
Can I use jms/object-routing with Laravel’s Eloquent models instead of Doctrine?
The package was designed for Doctrine, but you can adapt it for Eloquent by creating a custom `ObjectRouter` implementation. Override methods like `getIdentifier()` to return Eloquent model attributes (e.g., `id`). Test thoroughly, as Doctrine’s metadata handling differs from Eloquent’s. No built-in Eloquent support exists, so this requires custom code.
What Laravel versions does jms/object-routing support, and are there PHP 8.x issues?
The package was last updated for PHP 5.6+ and Laravel 5.x. For Laravel 8/9/10 (PHP 8.x), you’ll encounter deprecated functions (e.g., `str_contains()`) and array behavior changes. Backport fixes like replacing deprecated functions with their PHP 8.x equivalents (e.g., `str_contains()` → `str_contains()` with named args). Test route caching, as Laravel’s route cache may conflict with dynamic object-based routes.
How do I handle route conflicts when two objects map to the same URL (e.g., User@id=1 and Product@id=1)?
Conflicts arise when objects share the same identifier or path structure. Mitigate this by implementing priority rules in your `ObjectRouter` (e.g., route `User` before `Product`). Use middleware to validate object types before routing, or scope routes by namespace (e.g., `/users/1` vs. `/products/1`). Explicitly test edge cases with Laravel’s `Route::assertGenerated()`.
Is jms/object-routing suitable for RESTful APIs in Laravel, or should I stick to resource controllers?
It’s ideal for dynamic RESTful APIs where routes depend on object state (e.g., `/api/{resource}/{id}` generated from a `Resource` object). However, for conventional REST APIs, Laravel’s resource controllers (`Route::apiResource()`) are simpler and better optimized. Use object-routing only if you need runtime flexibility, like polymorphic APIs or admin panels with dynamic permissions.
How do I integrate jms/object-routing into a Laravel project without breaking existing routes?
Register the router in your `RouteServiceProvider`’s `boot()` method as a singleton. Use middleware to intercept requests and delegate to the object router for specific routes (e.g., admin or API prefixes). Avoid overriding Laravel’s core router; instead, treat it as a layer on top. Test with `php artisan route:list` to ensure no overlaps with static routes.
What testing strategies should I use for object-based routes in Laravel?
Test routes by asserting generated URLs with `Route::assertGenerated()` or `Route::get()->assertRedirect()`. Mock objects to verify path generation (e.g., `User@id=1` → `/users/1`). Use Laravel’s `Http::fake()` to simulate requests and validate object-to-route mappings. Since routes aren’t cached, test all dynamic scenarios in your CI pipeline.
Are there alternatives to jms/object-routing for dynamic Laravel routes?
For Laravel, consider `spatie/laravel-query-builder` (for dynamic API routes) or `spatie/laravel-permission` (for role-based routing). For object-centric routing, you could build a custom solution using Laravel’s `Route::bind()` or `Route::model()`. If you need DDD alignment, explore `ddd-php/ddd` or `craue/attributes` for attribute-based routing. jms/object-routing is unique for its object-state focus but may be overkill for simpler use cases.
How can I generate URLs from objects in templates or Blade views with this package?
Inject the `ObjectRouter` into your controllers or services, then call `router->generate($object)` to get the URL. In Blade views, pass the object to a helper (e.g., `@route($object)`) or use a facade if you wrap the package. Example: `{{ route('user.show', ['user' => $user]) }}` becomes `{{ $router->generate($user) }}`. Cache generated URLs if performance is critical.
What maintenance challenges should I expect with jms/object-routing in production?
The package is abandoned (last update: 2016), so PHP 8.x or Laravel 8+ may require backports. Monitor for breaking changes in Laravel’s router or dependency updates (e.g., Doctrine). Plan for route conflicts as your object graph grows. Document your custom `ObjectRouter` implementation for future developers. Consider forking the repo if you add Laravel-specific features like Eloquent support.
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.
sayedenam/sayed-dashboard
milito/query-filter
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed