petrehorne/elmer

本包最新版本(v0.2.0)没有提供许可证信息。

一个简单且灵活的PHP路由库

v0.2.0 2012-07-15 17:33 UTC

This package is not auto-updated.

Last update: 2024-09-14 12:21:07 UTC


README

#Elmer 构建状态

少而精 — 迪特·拉姆斯

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的RackPython的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