dasprid/dash

此包已被弃用且不再维护。未建议替代包。

灵活的PSR-7兼容HTTP路由器


README

                            ▄▄
                       █▀▀▄█░░█▄         ▄▄▄▄▀▀▀▀▀▀▄
                        ▀▄░░██░░█   █▀▀▀▀▀▓▓▓▓▓▓▒▓▄▄▓▀▄
    ▄▄▄▄▄▄  █▄         ▄▄█░░▀▄░█ ▄▄█▀▄▄▀▀█▒▒▒▄▄▀░▀▀██
  ▄█▀▀▀▀▀▀██▓█        █░▀█░░█░█▀▀▄▄█░░░▄▀▀▀▀░░░░░░░█
▄█▄▄▄░░░▒▒▒▀█▓█        ▀▄░█▀█▀▀█▀▄█▄▄▄▀░░░░▀▀█▀▀██░█
     ▀▀▄▓▓▓▒▒█▄▀▄      ▄▄█▀▀▄░░░█    █░░░░░░ ▀███░░░█▄
        ▀▄▄▓░▒▒▀█▄█▀▀▀▀▒▀█▄█▀░░█▀▀▀▀▀░█░░░░░░░░░░░▄░█
           ▀▀▄▄▓▓░░░░░▓▓▓▓▄█ ▀▄▄░▀░░░░░░░░░▄▄▄▄▄▄▄▄▄▄▀▀
               ▀▄▓▓▓▓▓▄▄▄▀  █▓▒░░░░░░░░░░░█▄▀▀▀█▄▄▄▄▄▄▄
                 ▀▀▀▀▀      ▄▀█░▓▒░░░░▄░░░█░▀░▄▄░░█▒▒▒▒▒▒▒█
                         ▄▄▄▀▀░░░░░░░░▄██▀▀▀▀▀▀█▀░░█▀▀▀▄▄▄▀
    DASH                █░░░░░▄▄▀█▄▄▄▀▀         █░░░█
                        █░░▄▄█▒▒▄▀               █░▄▀
                        ▀▀▀  ▀▀▀                  ▀

Build Status Scrutinizer Code Quality Coverage Status

Dash最初旨在作为Zend Framework 3的路由器,但现在已发展成一个独立的包。它依赖于ZF的ServiceManager,但仅用于其插件管理器实现。

安装

Dash应与依赖容器一起使用,但在理论上也可以不使用容器。在通常情况下,如果您使用Dash与另一个提供依赖容器的框架一起使用,则配置目录中会放置一个文件,其中包含所有必须注册的工厂。这些工厂假定您的容器也通过名称"config"提供配置数组。有关其具体内容,请参阅下面的示例。

在您的应用程序中,您可以通过实例化Dash\ConfigProvider轻松检索依赖配置。由于它实现了__invoke()方法,因此可以与expressive-config-manager之类的配置管理器一起使用。

路由配置

路由配置从ZF2大大简化了,现在路由有三个(可选)键索引数组作为前三个参数,快捷参数的格式为

[path, defaults, methods]

这可能会感觉反直觉,但想法是最常更改的参数排在最前面,因此在定义子路由时可以跳过要继承的参数。

path将期望一个字符串,而defaults将期望一个数组,method将期望一个应匹配该路由的方法数组、单个方法字符串或字符串'*'以匹配所有方法。空字符串''不匹配任何方法。目前,不传递方法默认为'*'

除了索引快捷参数外,还可以通过键值对传递命名配置

[
    'path' => '/foo',
    'defaults' => ['action' => 'bar', 'controller' => 'FooController'],
    'methods' => ['get', 'post']
]

参数和命名值可以混合,尽管前面三个索引项将始终假定是参数,按照上述顺序。

子路由

可以在父路由的配置中的children键中简单地定义子路由。

'dash' => [
    'routes' => [
        'user' => ['/user', ['action' => 'index', 'controller' => 'UserController'], 'children' => [
            'create' => ['/create', ['action' => 'create'], ['get', 'post']],
            'edit' => ['/edit/:id', ['action' => 'edit'], ['get', 'post'], 'constraints' => ['id' => '\d+']],
            'delete' => ['/delete/:id', ['action' => 'delete'], 'get', 'constraints' => ['id' => '\d+']],
        ]],
    ],
],

路由类型

路由器不再有多个路由类型,而是由Generic路由处理所有HTTP路由方面。不再在配置中指定路由类型,路由器现在可以根据配置本身处理所有路由。

例如,如果只想让给定路由匹配特定主机名,只需在路由配置中定义正确的键值对即可

'user' => ['/user', ['action' => index', 'controller' => 'UserController'], 'get', 'hostname' => 'login.example.com']

同样,如果给定路由应仅匹配https协议

'user' => ['/user', ['action' => index', 'controller' => 'UserController'], 'get', 'secure' => true]

超载

一个预计会是个小问题的混淆是,如何在不同的模块中如何重载给定的路由参数。这可以通过定义配置中相关的键值对来实现,该键值对旨在覆盖路由。通过快捷键重写路由参数不会生效,因为它只会被添加到配置数组的末尾。

Module A
'user' => ['/user', ['action' => index', 'controller' => 'UserController'], 'get']
Module B
'user' => ['path' => '/userinfo']

/user 现在将不再匹配,但 /userinfo 将会匹配。

开发

在进行性能相关的更改时,请确保比较主分支和您的分支之间的基准测试。要运行它们,执行以下命令:

php vendor/bin/athletic -p benchmark -b vendor/autoload.php