seytar/php-router

Laravel 路由器,用于 Laravel 框架之外

dev-1.0.x-stable 2021-11-04 12:49 UTC

This package is not auto-updated.

Last update: 2024-09-28 16:46:12 UTC


README

Laravel 路由器,用于 Laravel 框架之外。

安装

将包添加到您的 composer.json 文件中,并运行 composer update

{
    "require": {
        "seytar/php-router": "1.0.x-stable"
    }
}

使用方法

要开始使用路由器,您需要像这样引导它

require 'vendor/autoload.php';

use Seytar\Routing\Router;

Router::bootstrap(function($ex) {
        header('Content-Type: text/html; charset=utf-8');
        echo '404 - Page Not Found';
    });

完成此操作后,您可以像在 Laravel 中那样定义任何路由

Route::get('/', function()
{
	echo 'Hello world.';
});

引导过程将检查您的应用程序中是否存在 routes.php 文件,并将自动为您加载它。它还会注册一个关闭函数,该函数将调度当前请求。如果您想手动调度当前请求,可以调用 Router::dispatch()

RequestResponseInputURL 门面也可用。

基本 GET 路由

Route::get('/', function()
{
	return 'Hello World';
});

基本 POST 路由

Route::post('foo/bar', function()
{
	return 'Hello World';
});

为多个动词注册路由

Route::match(array('GET', 'POST'), '/', function()
{
	return 'Hello World';
});

注册响应任何 HTTP 动词的路由

Route::any('foo', function()
{
	return 'Hello World';
});

强制路由通过 HTTPS 提供服务

Route::get('foo', array('https', function()
{
	return 'Must be over HTTPS';
}));

通常,您需要生成路由的 URL,您可以使用 URL::to 方法完成此操作

$url = URL::to('foo');

路由参数

Route::get('user/{id}', function($id)
{
	return 'User '.$id;
});

可选路由参数

Route::get('user/{name?}', function($name = null)
{
	return $name;
});

具有默认值的可选路由参数

Route::get('user/{name?}', function($name = 'John')
{
	return $name;
});

正则表达式路由约束

Route::get('user/{name}', function($name)
{
	//
})
->where('name', '[A-Za-z]+');

Route::get('user/{id}', function($id)
{
	//
})
->where('id', '[0-9]+');

传递一组 WHERE 条件

当然,您可以在需要时传递一组约束

Route::get('user/{id}/{name}', function($id, $name)
{
	//
})
->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))

定义全局模式

如果您希望路由参数始终受给定正则表达式的约束,可以使用 pattern 方法

Route::pattern('id', '[0-9]+');

Route::get('user/{id}', function($id)
{
	// Only called if {id} is numeric.
});

访问路由参数值

如果您需要在路由之外访问路由参数值,可以使用 Route::input 方法

Route::filter('foo', function()
{
	if (Route::input('id') == 1)
	{
		//
	}
});

路由过滤器

路由过滤器提供了限制对给定路由访问的便捷方式,这对于创建需要身份验证的网站区域非常有用。Laravel 框架中包含了一些过滤器,包括 auth 过滤器、auth.basic 过滤器、guest 过滤器和 csrf 过滤器。这些位于 app/filters.php 文件中。

定义路由过滤器

Route::filter('old', function()
{
	if (Input::get('age') < 200)
	{
		return Redirect::to('home');
	}
});

如果过滤器返回一个响应,则该响应被认为是请求的响应,并且该路由将不会执行。路由上的任何 after 过滤器也将被取消。

将过滤器附加到路由

Route::get('user', array('before' => 'old', function()
{
	return 'You are over 200 years old!';
}));

将过滤器附加到控制器操作

Route::get('user', array('before' => 'old', 'uses' => 'UserController@showProfile'));

将多个过滤器附加到路由

Route::get('user', array('before' => 'auth|old', function()
{
	return 'You are authenticated and over 200 years old!';
}));

通过数组附加多个过滤器

Route::get('user', array('before' => array('auth', 'old'), function()
{
	return 'You are authenticated and over 200 years old!';
}));

指定过滤器参数

Route::filter('age', function($route, $request, $value)
{
	//
});

Route::get('user', array('before' => 'age:200', function()
{
	return 'Hello World';
}));

after 过滤器接收作为过滤器第三个参数传递的 $response

Route::filter('log', function($route, $request, $response)
{
	//
});

基于模式的过滤器

您还可以指定过滤器根据它们的 URI 适用于整个路由集

Route::filter('admin', function()
{
	//
});

Route::when('admin/*', 'admin');

在上面的示例中,admin 过滤器将应用于以 admin/ 开头的所有路由。星号用作通配符,可以匹配任何字符组合。

您还可以通过 HTTP 动词约束模式过滤器

Route::when('admin/*', 'admin', array('post'));

过滤器类

对于高级过滤,您可能希望使用类而不是闭包。由于过滤器类是通过应用程序 IoC 容器 解析的,因此您可以在这些过滤器中利用依赖注入以提高可测试性。

基于类的过滤器注册

Route::filter('foo', 'FooFilter');

默认情况下,将调用 FooFilter 类上的 filter 方法

class FooFilter {

	public function filter()
	{
		// Filter logic...
	}

}

如果您不想使用 filter 方法,只需指定另一个方法即可

Route::filter('foo', 'FooFilter@foo');

命名路由

命名路由使得在生成重定向或URL时引用路由更加方便。您可以这样为路由指定一个名称

Route::get('user/profile', array('as' => 'profile', function()
{
	//
}));

您还可以为控制器动作指定路由名称

Route::get('user/profile', array('as' => 'profile', 'uses' => 'UserController@showProfile'));

现在,您可以在生成URL或重定向时使用路由的名称

$url = URL::route('profile');

$redirect = Redirect::route('profile');

您可以通过 currentRouteName 方法访问正在运行的路由的名称

$name = Route::currentRouteName();

路由分组

有时您可能需要将过滤器应用于一组路由。您不必在每条路由上指定过滤器,而是可以使用路由分组

Route::group(array('before' => 'auth'), function()
{
	Route::get('/', function()
	{
		// Has Auth Filter
	});

	Route::get('user/profile', function()
	{
		// Has Auth Filter
	});
});

您还可以在 group 数组中使用 namespace 参数来指定该组中的所有控制器属于给定的命名空间

Route::group(array('namespace' => 'Admin'), function()
{
	//
});

子域路由

Laravel 路由也能够处理通配符子域,并将通配符参数从域名传递给您

注册子域路由

Route::group(array('domain' => '{account}.myapp.com'), function()
{

	Route::get('user/{id}', function($account, $id)
	{
		//
	});

});

路由前缀

您可以使用分组属性数组中的 prefix 选项来为路由组添加前缀

Route::group(array('prefix' => 'admin'), function()
{

	Route::get('user', function()
	{
		//
	});

});