knplabs/rad-resource-resolver

该软件包已被废弃,不再维护。未建议替代软件包。

基于约定的路由资源解析器

v2.2 2017-09-21 08:24 UTC

README

不幸的是,我们决定不再维护此项目 anymore (查看原因)。如果您想标记另一个软件包作为此软件包的替代品,请发送电子邮件至 hello@knplabs.com

Knp Rad Resource Resolver

Build Status Scrutinizer Code Quality Latest Stable Version Total Downloads Latest Unstable Version License

官方维护者

为什么使用它?

在控制器中重复做同样的事情,比如将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 位置的语法。

这意味着您可以轻松添加自己的 ParameterCastersParsers 来更改组件使用的语法。

要添加自己的 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许可协议发布。请随意贡献。