juizmill/silex-routing-service-provider

Silex的路由提供者,用于添加路由

1.5.0 2016-02-08 08:27 UTC

This package is not auto-updated.

Last update: 2024-09-20 18:59:18 UTC


README

Latest Version Software License Build Status Coverage Status Quality Score Total Downloads

RoutingServiceProvider 是一个用于轻松添加路由的 Silex 提供者

功能

  • 通过配置注册提供者
  • 使用提供者注册多个提供者
  • 使用提供者注册单个提供者

安装

通过 Composer

composer require marcojanssen/silex-routing-service-provider

选项

每个路由都需要以下参数

  • pattern (字符串)
  • controller (字符串)
  • method - get, put, post, delete, options, head (数组|string)

可选地,您可以设置路由名称(对于命名路由)。$route-array 的键将用作路由名称,或者您可以按如下设置

$routes = array(
    'foo' => array(
        //'name' => 'foo', --> you can omit the name if a key is set
        'pattern' => '/foo',
        'controller' => 'Foo\Controller\FooController::fooAction',
        'method' => array('get', 'post', 'put', 'delete', 'options', 'head')
    )
);

可选地,还可以添加以下参数

value (数组)

您可以添加任何路由变量的默认值: http://silex.sensiolabs.org/doc/usage.html#default-values

$value = array('name' => 'value')

assert (数组)

您可以添加要求: http://silex.sensiolabs.org/doc/usage.html#requirements

$assert = array('id' => '^[\d]+$')

convert (数组)

您可以添加路由变量转换器: http://silex.sensiolabs.org/doc/usage.html#route-variable-converters。在您可以使用路由变量转换器之前,您需要将其添加为服务。

$after = array('convert' => function() {})

before (字符串|array)

添加一个 before 中间件: http://silex.sensiolabs.org/doc/middlewares.html#before-middleware

$before = array('before' => function() {})

after (字符串|array)

添加一个 after 中间件: http://silex.sensiolabs.org/doc/middlewares.html#after-middleware

$after = array('after' => function() {})

secure (数组)

您使用特性: http://silex.sensiolabs.org/doc/providers/security.html#traits

$secure = array('ROLE_ADMIN')

用法

添加单个路由

index.php

use Silex\Application;
use MJanssen\Provider\RoutingServiceProvider;

$app = new Application();
$routingServiceProvider = new RoutingServiceProvider();

$route = array(
    'name' => 'foo',
    'pattern' => '/foo',
    'controller' => 'Foo\Controller\FooController::fooAction',
    'method' => array('get', 'post', 'put', 'delete', 'options', 'head')
);

$routingServiceProvider->addRoute($app, $route);

添加多个路由

index.php

use Silex\Application;
use MJanssen\Provider\RoutingServiceProvider;

$app = new Application();
$routingServiceProvider = new RoutingServiceProvider();

$routes = array(
    'foo' => array(
        //'name' => 'foo', --> you can omit the route name if a key is set
        'pattern' => '/foo',
        'controller' => 'Foo\Controller\FooController::fooAction',
        'method' => array('get', 'post', 'put', 'delete', 'options', 'head')
    ),
    'baz' => array(
        //'name' => 'baz', --> you can omit the route name if a key is set
        'pattern' => '/baz',
        'controller' => 'Baz\Controller\BazController::bazAction',
        'method' => 'get'
    )
);

$routingServiceProvider->addRoutes($app, $route);

添加 before/after 中间件

要添加控制器中间件,您可以使用路由配置中的 'after' 和 'before' 键。'before' 键用于在执行控制器逻辑之前和之后运行中间件代码。以下是一个使用中间件类及其在路由配置中配置的示例。您也可以使用常规回调而不是中间件类。

注意 请注意,目前仅支持 PHP。

示例中间件类

class MiddleWare {

    public function __invoke(Request $request, Application $app)
    {
        //do stuff
        $x = 1;
    }
}

在路由配置中使用中间件类

index.php

use Silex\Application;
use MJanssen\Provider\RoutingServiceProvider;

$app = new Application();
$routingServiceProvider = new RoutingServiceProvider();

$routes = array(
    'foo' => array(
        //'name' => 'foo', --> you can omit the route name if a key is set
        'pattern' => '/foo',
        'controller' => 'Foo\Controller\FooController::fooAction',
        'method' => array('get'),
        // this is where it all happens!
        'before' => array(new MiddleWare())
    )
);
$routingServiceProvider->addRoutes($app, $route);

通过 yml 添加路由中间件类

您可以通过 yml-/xml-配置添加中间件类。示例

routes.yaml

config.routes:
    home:
        name: 'home'
        pattern: /
        method: [ 'get', 'post' ]
        controller: 'Foo\Controllers\FooController::getAction'
        before: 'Foo\Middleware\FooController::before'
        after: 'Foo\Middleware\FooController::after'

方法的接口需要符合 Silex 规范。有关路由中间件类的更多信息:http://silex.sensiolabs.org/doc/middlewares.html#route-middlewares

注意:遗憾的是,使用这种方法,您不能使用上述描述的 '____invoke' 方法。

使用配置注册提供者

在这个例子中,使用ConfigServiceProvider来读取yml文件。路由服务提供商通过节点config.routing选择存储的配置,默认情况下为$app['config.routing']。如果您想设置不同的键,在实例化路由服务提供商时将其作为参数添加。**注意:数组键也将用作'route',因此您可以省略'route'。

routes.yaml

config.routes:
    home:
        name: 'home'
        pattern: /
        method: [ 'get', 'post' ]
        controller: 'Foo\Controllers\FooController::getAction'

routes.php

return array(
    'custom.routing.key' => array(
        array(
            'pattern' => '/foo/{id}',
            'controller' => 'Foo\Controllers\FooController::getAction',
            'method' => 'get',
            'assert' => array(
                'id' => '^[\d]+$'
            ),
            'value' => array(
                'value1' => 'foo',
                'value2' => 'baz'
            )
        )
    )
);

index.php

use Silex\Application;
use Igorw\Silex\ConfigServiceProvider;
use MJanssen\Provider\RoutingServiceProvider;

$app = new Application();

//Set all routes
$app->register(
    new ConfigServiceProvider(__DIR__."/../app/config/routes.php")
);

//Add all routes
$app->register(new RoutingServiceProvider('custom.routing.key'));

注意:建议使用php而不是yml/xml等,因为php可以被opcached。否则,您必须自己实现缓存机制。

待办事项

  • 转换:路由变量转换器需要是服务。我们需要一种方法将它们添加为有效的回调,例如MyNamespace\MyClass::converter