用AI赚第一桶💰低成本搭建一套AI赚钱工具,源码可二开。 广告
目录 [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]); }); ```