marcojanssen/silex-routing-service-provider

此包已被废弃且不再维护。没有建议替代包。

Silex 路由提供者

1.6.0 2017-05-08 17:34 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:27:27 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](http://silex.sensiolabs.org/doc/middlewares.html#route-middlewares)。

注意:遗憾的是,这种方式无法使用上面描述的'__invoke'方法。

使用配置注册提供者

在这个例子中,使用ConfigServiceProvider来读取yml文件。RoutingServiceProvider通过节点config.routing选择存储的配置,默认为$app['config.routing']。如果您想设置不同的键,在实例化RoutingServiceProvider时将其作为参数添加 ***注意:数组键也将用作'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。否则,您必须自己实现缓存机制。

待办事项

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