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
不幸的是,我们决定不再维护此项目 anymore (查看原因)。如果您想标记另一个软件包作为此软件包的替代品,请发送电子邮件至 hello@knplabs.com。
Knp Rad Resource Resolver
官方维护者
为什么使用它?
在控制器中重复做同样的事情,比如将URL值转换为对象?不想使用ParamConverter注解?
这个资源解析器是为您准备的。
安装
使用composer
$ composer require knplabs/rad-resource-resolver
如果您正在使用symfony2,您可以更新您的 app/AppKernel.php
文件
public function registerBundles() { $bundles = array( // bundles here ... new Knp\Rad\ResourceResolver\Bundle\ResourceResolverBundle(), ); }
如何使用它?
在一个yaml路由文件中,它可能看起来像这样
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
在 _resources
下的每个 key
都将被返回为请求属性中的 $key
转换值。
然而,您可以使用更简洁的方式来表达您的资源配置
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]]
可选资源
默认情况下,Rad资源解析器在资源未找到时抛出 Symfony\Component\HttpKernel\Exception\NotFoundHttpException
。您可以通过将 required
选项添加到 false 来覆盖此行为
_resources: buildings: service: app.building.repository method: findByCountryAndCityAndActivity arguments: [$countryId, $citySlug, "School"] required: false
可用的资源解析参数
- URL变量:您必须使用
$
前缀。例如,如果您的URL是/products/{products}/
,您可以通过使用$product
来访问product
值。 - 服务:您可以使用
@
前缀(例如:@doctrine) - 以前解析的资源:您可以使用
&
前缀(例如:&user
将返回user
资源)
它是如何工作的?
ResourcesListener
监听 kernel.controller
事件并自动解析 _resources
中的所有资源。该组件使用 ParameterCaster
对象来捕获不同的参数类型,并使用 Parser
对象来解析 _resources 位置的语法。
这意味着您可以轻松添加自己的 ParameterCasters
和 Parsers
来更改组件使用的语法。
要添加自己的 ParameterCaster
,只需将其标记为 knp_rad_resource_resolver.parameter_caster
。添加 Parser
的标记是 knp_rad_resource_resolver.parser
。
事件
所有事件都在这里列出。
如何挂钩资源解析?
有两个事件
- 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.
如何获取所有已解析的资源?
存在一个名为 knp_rad_resource_resolver.resource_container
的服务别名,您可以从中获取所有已解析的资源。您还可以监听事件 knp_rad_resource_resolver.resource.added
,并在资源添加到容器时收到通知。
许可协议
本项目遵循MIT许可协议发布。请随意贡献。