samir-plusb/silex-routing-service-provider

Silex路由添加提供者

1.2.2 2015-04-07 10:07 UTC

This package is not auto-updated.

Last update: 2024-09-28 16:57:08 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(数组)

可选地,您可以设置路由名称(对于命名路由)。$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(数组)

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

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

after(数组)

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

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

用法

添加单个路由

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' => array('get', 'post', 'put', 'delete', 'options', 'head')
    )
);

$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文件。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' => array(
                '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 RoutingServiceProvider(__DIR__."/../app/config/routes.php")
);

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

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

待办事项

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