juizmill / silex-routing-service-provider
Silex的路由提供者,用于添加路由
Requires
- silex/silex: ~1.1
Requires (Dev)
- phpunit/phpunit: 4.*
- scrutinizer/ocular: ~1.1
Suggests
- igorw/config-service-provider: Allows registering providers with configuration
This package is not auto-updated.
Last update: 2024-09-20 18:59:18 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。
注意:遗憾的是,使用这种方法,您不能使用上述描述的 '____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