knplabs / rad-resource-resolver
A routing resource resolver based on conventions
Installs: 54 878
Dependents: 1
Suggesters: 1
Security: 0
Stars: 13
Watchers: 29
Forks: 4
Open Issues: 3
pkg:composer/knplabs/rad-resource-resolver
Requires
- php: ~7.0
- symfony/config: ~2.8 || ~3.0
- symfony/dependency-injection: ~2.8 || ~3.0
- symfony/event-dispatcher: ~2.8 || ~3.0
- symfony/http-foundation: ~2.8 || ~3.0
- symfony/http-kernel: ~2.8 || ~3.0
- symfony/routing: ~2.8 || ~3.0
Requires (Dev)
- pedrotroller/php-cs-custom-fixer: ~1.2.1
- phpspec/phpspec: ~2.4
- phpspec/prophecy: ~1.6
This package is auto-updated.
Last update: 2022-09-23 13:36:28 UTC
README
Unfortunately we decided to not maintain this project anymore (see why). If you want to mark another package as a replacement for this one please send an email to hello@knplabs.com.
Knp Rad Resource Resolver
Official maintainers:
Why using it?
Tired of doing the same things again and again in your controllers, like transforming a URL value in an object? Don't want to use ParamConverter Annotations?
This Resource Resolver is for you.
Installation
With composer :
$ composer require knplabs/rad-resource-resolver
If you are using symfony2 you can update your app/AppKernel.php file:
public function registerBundles() { $bundles = array( // bundles here ... new Knp\Rad\ResourceResolver\Bundle\ResourceResolverBundle(), ); }
How to use it?
In a yaml routing file, it could look like this :
users_show: path: /users/{id} defaults: _resources: user: service: my.user.repository method: find arguments: [$id] # This will automatically resolve the resource to give you a $user object in your request attributes
countries_cities_buildings_index: path: /countries/{countryId}/cities/{citySlug}/buildings defaults: _resources: buildings: service: app.building.repository method: findByCountryAndCityAndActivity arguments: [$countryId, $citySlug, "School"] # You will have a $buildings variable in your request attributes
Every key under _resources will be return as a $key converted value in your request attributes.
However, you can use more concise ways to express your resources configuration :
product_show: path: /product/{slug} defaults: _resources: product: [ "my.repository.product:findBySlug", [ $slug ] ] bestSellers: "my.repository.seller:findBestSellers" # Supports invokable bestOffers: "my.repository.bestOffers" comments: ["my.repository.randomComments"] # Invokable with arguments relatedProducts: ["my.repository.relatedProducts", [10]]
Optional Resources
By default, the Rad Resource Resolver throws a Symfony\Component\HttpKernel\Exception\NotFoundHttpException if the resource was not found. You can override this behavior by adding the required option to false:
_resources: buildings: service: app.building.repository method: findByCountryAndCityAndActivity arguments: [$countryId, $citySlug, "School"] required: false
Available resource resolving arguments
- URL variables: you have to use the
$prefix. For example, if your URL is/products/{products}/you can access toproductvalue by using$product. - Services: you can use the
@prefix (ex: @doctrine) - Previously resolved resources: you can use the
&prefix (ex:&userwill return theuserresource)
How does it work?
A ResourcesListener listens to kernel.controller event and resolves automatically all resources in _resources.
The component uses ParameterCaster objects to catch different argument types and Parser objects to resolve _resources locations syntax.
This means you can easily add your own ParameterCasters and Parsers to change the syntax used by the component.
To add your own ParameterCaster, just tag it with knp_rad_resource_resolver.parameter_caster.
The tag to add a Parser is knp_rad_resource_resolver.parser.
Events
All events are listed here.
How can I hook resource resolution ?
There is two events :
- knp_rad_resource_resolver.before_resource_resolved: dispatched before the resolution. You can set the resource before the resolution.
- knp_rad_resource_resolver.resource_resolved: dispatched after the resolution.
How can I get all resolved resources ?
There is a service alias named knp_rad_resource_resolver.resource_container where you can get all resolved resources. You can also listen to the event knp_rad_resource_resolver.resource.added and be notified when a resource is added to the container.
License
This project is published under MIT License. Feel free to contribute.