marcojanssen / silex-routing-service-provider
Silex 路由提供者
Requires
- php: >=5.6
- silex/silex: ^2.0
Requires (Dev)
- phpunit/phpunit: ^5.5
- scrutinizer/ocular: ^1.3
- symfony/security: ~v3.1.0
Suggests
- igorw/config-service-provider: Allows registering providers with configuration
This package is not auto-updated.
Last update: 2022-02-01 12:27:27 UTC
README
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