目录
[TOC]
## 路由文件
默认的路由文件为项目目录下的 routes/app.php,你可以在这个文件中新建路由。
如果你想新建其它文件来配置路由,请在 routes 目录或其子目录中新建路由文件,然后在 bootstrap/boot.php 中 require 该文件即可。
## 新建路由
你可以在路由文件中创建路由,路由支持两种模式:**闭包、控制器@方法**。你可以新建任何 HTTP 支持的方法的路由,如 get、post、put、patch、delete 等。
例子:
```php
use WorkerF\Http\Route;
// 闭包
Route::get('/test', function() {
return 'hello!';
});
Route::put('/a/b', function() {
return 'a and b!';
});
// 控制器@方法
Route::post('/test', 'App\Controller\TestController@test');
```
**注:** 虽然闭包路由很方便,但是请不要把业务逻辑都写到路由文件里来,写到控制器中才是最佳实践。
## 路由分组
对于多个路由有共同的 path 前缀、命名空间等情况,可以使用 group 方法进行分组。
### 前缀
```php
use WorkerF\Http\Route;
Route::group(['prefix' => '/pre'], function() {
Route::get('/', 'App\Controller\TestController@index');
Route::post('create/', 'App\Controller\TestController@create');
});
```
### 命名空间
```php
use WorkerF\Http\Route;
Route::group(['prefix' => '/pre', 'namespace' => 'App\Controller'], function() {
Route::get('/', 'TestController@index');
Route::post('create/', 'TestController@create');
});
```
### 路由中间件
路由中间件需要在配置文件 config/middleware.php 中注册后才能使用,参见 [基本使用 - 中间件](中间件.md)。
```php
use WorkerF\Http\Route;
Route::group(['middleware' => '/auth', 'namespace' => 'App\Controller'], function() {
Route::get('/', 'TestController@index');
Route::post('create/', 'TestController@create');
});
```
### 分组嵌套
路由分组支持分组嵌套,你可以灵活的创建路由:
```php
use WorkerF\Http\Route;
Route::group(['prefix' => '/user', 'namespace' => 'App\Controller'], function() {
Route::get('login', 'TestController@login');
Route::group(['middleware' => 'auth'], function() {
Route::get('admin', 'TestController@index');
Route::post('create', "TestController@create");
});
});
```
## 动态路由
框架支持动态路由,你可以使用动态路由轻松的实现 RESTful 风格的 WebAPI。
动态路由使用大括号 {} 来传参,参数会依次传入闭包中 (或控制器方法) 中。如:路由 /post/{id} 会匹配任何类似 /post/1、/post/2、/post/something 之类的路径。
```php
use WorkerF\Http\Route;
Route::get('/post/{id}', function($id) {
return $id;
});
// id 和 name 会依次传入 TestController 的 test 方法中
Route::get('/a/{id}/b/{name}', 'App\Controller\TestController@test');
```
### 路由缓存
由于动态路由需要对请求的 path 和路由进行正则匹配,需要遍历所有动态路由进行依次匹配,这个过程的时间复杂度是 O(n),当动态路由的数量增大时性能会线性下降。为了解决这个问题,WorkerA 使用了路由缓存,由于常驻内存程序的特性,框架会直接将新的动态路由请求缓存到内存中,再次访问会直接从缓存中取值,将时间复杂度降到了 O(1)。
> 1.1.0 版本的路由缓存只是简单的把路由放到了内存中,并没有进行控制,导致了缓存太大时内存泄漏进程重启的问题,会对业务产生影响。1.1.1 中已经修复这个问题,使用了 LRU 算法对缓存的大小进行了控制,同时兼顾了缓存的性能。
> 在 1.1.1 版本中,你可以通过修改 bootstrap/boot.php 中 Route::setVariableRouteCacheLimit(8129) 这行来修改路由缓存的最大个数 ( 这个数值根据具体的业务情况设置,比如说活跃的动态路由总个数超过默认值很多时需要适当调大。设置太大会导致进程占用内存增加,默认为 8192,最小为 1 )。
> 升级到 1.1.1 ( 查看 [旧版本升级-小版本升级](旧版本升级.md))。
### 动态路由会覆盖普通路由吗?
Q:例如创建了一个普通路由 /post/goods 和一个动态路由 /post/{name},当用户请求 /post/goods 时会不会被当作动态路由呢?
A:不会,路由分发时会先检查该路径对应的普通路由是否存在,不存在才会检查动态路由。
## 路由重定向
WorkerA 支持路由重定向,你可以使用 WorkerF\Http\Route 类的 redirect($path, $param = \[\]) 方法进行重定向。
注:只有在路由闭包或控制器方法中返回 redirect() 方法的返回值才能有效重定向。
例子:
```php
use WorkerF\Http\Route;
use WorkerF\Http\Requests;
Route::get('/a', function() {
// 打印重定向请求参数
$request = new Requests();
var_dump($request->name, $request->age);
return 'a';
});
Route::get('/b', function() {
// 重定向到路由 /a
return Route::redirect('/a');
});
Route::get('/b1', function() {
// 无效操作,执行结果没有被返回
Route::redirect('/a');
return 'b1';
});
Route::get('/c', function() {
// 重定向到路由 /a,并传递 GET 参数
return Route::redirect('/a', ['name' => 'mike', 'age' => 23]);
});
```