seytar / php-router
Laravel 路由器,用于 Laravel 框架之外
Requires
- illuminate/events: 4.*
- illuminate/routing: 4.*
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()
。
Request
、Response
、Input
和 URL
门面也可用。
基本 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()
{
//
});
});