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.
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.
With composer :
$ composer require knplabs/rad-resource-resolverIf 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(),
);
}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 attributesEvery 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]]
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- 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)
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.
All events are listed here.
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.
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.
This project is published under MIT License. Feel free to contribute.
