petrehorne / elmer
一个简单且灵活的PHP路由库
README
少而精 — 迪特·拉姆斯
Elmer是一个简单且灵活的PHP Web路由框架。
入门指南
<?php use Elmer\Environment; use Elmer\Response; use Elmer\Routes; require '../vendor/autoload.php'; $app = new Routes(function($app) { $app->get('/', function($env) { return new Response(200, 'Hello, world!'); } }); $response = $app(Environment::initFromGlobals()); $response->send();
创建一个当用户将浏览器导航到网站根目录时显示“Hello, world”的应用程序只需要以下步骤。
方法
我们通过在应用程序实例上调用get
方法为我们的应用程序分配了一个新路由。该方法指代HTTP方法,我们可以通过更改在应用程序上调用的方法来响应任何HTTP方法。
<?php $app->post(); $app->delete(); $app->brew(); // Custom methods are supported
路由参数
URI可以包含参数。参数以分号开头,后跟参数类型
<?php $app->get('/users/:int', function($app, $id) { return "You are user #$id"; });
此路由将匹配/users
后跟任何数字,例如/users/21
。
您可以使用以下参数
:any // Anything (alpha, num, underscore, or dash) :int // Any integer :alpha // Any alphabetic character :alphanum // Any alphanumeric character :year // 4 digits :month // 1 - 12 :day // 1 - 31
您可以通过修改应用程序实例的patterns
属性来添加自定义参数,如下所示
<?php $app->patterns['names'] = '(peter|simon|john)';
您还可以在行内编写自己的自定义正则表达式。请确保将其括在括号内,以便将其计为一个匹配部分。
可选参数
URI的一部分可以通过附加一个问号标记为可选
<?php $app->get('/articles/:year?', function($app, $year = 2012) { .. });
此路由将匹配请求/articles
,以及/articles/2011
。
不要忘记为可选参数设置默认值!
响应
待办事项
过滤器
过滤器“包装”在路由周围,以便您可以为应用程序添加额外的功能,例如记录和身份验证。
过滤器看起来像这样
<?php $app->filter(function($app, $route)) { $response = $route(); $response['body'] .= 'Bar'; return $response; } $app->get('/', function() { return 'Foo'; }
上面的过滤器将“Bar”追加到响应中,因此最终结果将是FooBar
。路由传递给过滤器,过滤器负责通过调用路由闭包来继续执行应用程序。这允许在/之后运行代码,修改响应或完全跳过调用路由。
过滤器可以用于各种任务,例如身份验证或记录,限制只在于您的想象力!
过滤器灵感来自Ruby的Rack和Python的WSGI的中间件。
多个过滤器
您可以使用任意数量的过滤器。
分组
分组允许您将过滤器应用于有限的路由子集。要定义一个分组,只需将几个路由包裹在以下内容中
<?php $app->group(function($app) { // Declare filters here // Declare routes here }
现在,上述分组中声明的任何过滤器都只会应用于同一组中声明的路由。
您可以根据需要嵌套分组。过滤器应用于子分组,但子分组中的过滤器不会应用于父分组中的路由。例如
<?php $app->group(function($app) { $app->filter(function($route) { .. }); // Filter A $app->get('/foo', function() { .. }); $app->group(function($app) { $app->filter($route) { .. }); // Filter B $app->get('/bar', function() { .. }); }); });
在上面的代码示例中,过滤器A适用于路由/foo
和/bar
。过滤器B仅适用于路由/foo
。
路由前缀
您可以通过将URI前缀作为分组声明中的第一个参数传递来为路由组应用前缀。
<?php $app->group('/user', function($app) { $app->get('/profile', function() { .. }); }
上述路由将匹配请求GET /user/profile
。