# lann-route **Repository Path**: calject/lann-route ## Basic Information - **Project Name**: lann-route - **Description**: laravel annotation route(laravel 注解路由实现) - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2019-12-25 - **Last Updated**: 2022-02-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # lann-route [![PHP version](https://badge.fury.io/ph/calject%2Flann-route.svg)](https://badge.fury.io/ph/calject%2Flann-route) [![license](https://img.shields.io/packagist/l/calject/lann-route)](https://github.com/calject/lann-route/blob/master/LICENSE) ## 版本说明 ### v1.0 * 基础版本(通过注解(doc注释)自动解析路由文件) ### v1.1 * 添加`php artisan calject:route:file` 命令根据注解(doc注释)生成路由文件 ``` Description: 根据注解路由生成路由文件 Usage: calject:route:file [options] Options: --path[=PATH] 设置扫描的路径参数(目录/具体路由文件),默认为app/Http/Controllers --env[=ENV] 设置生成的env环境路由,仅生成参数内配置的env路由,多个环境以,分割(例: local,develop),默认不检查@env(...) --force 是否强制生成文件,将覆盖原有文件,默认已存在的文件不重复生成 ``` * 添加 `@des(...)`、`@env(...)`、`@file(...)` Tag, 参考使用介绍 * 路由生成示例(routes/test.php) ```php "file", "namespace" => "Annotation"], function () { // 文件上传 Route::post('upload', 'UploadController@upload'); // 文件下载 Route::get('download', 'UploadController@download'); }); /** * Class TestController * @package App\Http\Controllers\Annotation */ Route::group(["prefix" => "annotation", "middleware" => ["api"], "namespace" => "Annotation"], function () { Route::get('getPath', 'TestController@getPath'); Route::post('setPath', 'TestController@setPath'); Route::match(["get", "post", "put", "delete"], 'user', 'TestController@user')->name('user'); Route::match(["get", "post", "put", "delete"], 'file', 'TestController@file'); Route::match(["get", "post", "put", "delete"], 'article', 'TestController@article'); }); ``` ## **Table of Contents** * [一、介绍](#一介绍-top) * [二、安装](#二安装-top) * [三、使用](#三使用-top) * [Class Annotation Tag](#class-annotation-tag) * [@file](#file) 设置生成路由文件名 * [@group](#group) route group * [@env](#env) 设置路由生效环境 * [@prefix](#prefix) route prefix * [@middleware](#middleware) route middleware * [@any](#any) 设置当前控制器请求方式默认为any * [@restful](#restful) 设置当前控制器请求方式默认为restful(get|post|put|delete) * [@get](#get) 设置当前控制器请求方式默认为get * [@post](#post) 设置当前控制器请求方式默认为post * [@put](#put) 设置当前控制器请求方式默认为put * [@delete](#delete) 设置当前控制器请求方式默认为delete * [Function Annotation Tag](#function-annotation-tag) * [@uri](#uri) 设置请求方法的请求路径 * [@name](#name) 设置路由别名 * [@des](#des) 添加路由描述 * [@env](#env-1) 设置当前请求方法生效环境 * [@prefix](#prefix-1) route prefix * [@middleware](#middleware-1) route middleware * [@any](#any-1) 设置当前路由请求方式为any * [@restful](#restful-1) 设置当前路由请求方式为restful(get|post|put|delete) * [@get](#get-1) 设置当前路由请求方式为get * [@post](#post-1) 设置当前路由请求方式为post * [@put](#put-1) 设置当前路由请求方式为put * [@delete](#delete-1) 设置当前路由请求方式为delete * [四、拓展](#expand) ## 一、介绍 [top](#lann-route) laravel annotation route(laravel 注解路由实现) ### 缓存 * 不使用该路由功能,仅使用根据注解生成路由文件(开发中... v1.1) * 配合laravel框架内置路由缓存`php artisan route:cache`使用(仅在生成路由缓存时遍历一次控制器文件) ## 二、安装 [top](#lann-route) ``` composer require calject/lann-route ``` ## 三、使用 [top](#lann-route) > `AnnotationRouteLocalProvider`、`AnnotationRouteProvider`、`AnnotationRoute` #### 服务提供者注册实现 * `config/app.php` => 'providers' 属性中添加`AnnotationRouteLocalProvider`或`AnnotationRouteProvider`服务提供者 > `AnnotationRouteLocalProvider`仅在env环境为local中生效, `AnnotationRouteProvider` 在所有环境中生效, 可通过`AnnotationRoute`的`env`方法设置 #### 自定义实现 * `app/Providers/RouteServiceProvider.php` 中添加注解实现`AnnotationRoute` ```php /** * Define the routes for the application. * * @return void */ public function map() { $this->mapApiRoutes(); $this->mapCreditRoutes(); $this->mapDevelopRoutes(); $this->mapTestRoutes(); // 添加注解实现 $annotationRoute = new AnnotationRoute(); // $annotationRoute->envs('local'); // 设置生效环境 // $annotationRoute->envs(['local', 'develop']); // 设置生效环境 $annotationRoute->register(...); // 注册:实现Calject\LannRoute\Contracts\AnnotationTagInterface接口的tag类 $annotationRoute->mapRefRoutes(); } ``` * 示例 ```php Class Annotation Tag > 类注解(作用于所有类方法上,方法上定义同类型tag覆盖类定义) #### `@file(...)` * `@file('filePath')` 设置生成的路由文件名(可忽略后缀) * 示例1: @file('route.php') 生成路由文件为routes目录下route.php文件 * 示例2: @file(article) 生成路由文件为routes目录下article.php文件 * 示例3: @file(test/article) 生成路由文件为routes/test目录下article.php文件 #### `@group(...)` * `@group(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `method`[array] : 请求类型, -- * `get` * `post` * `put` * `delete` * `...` * `middleware`[array] : 请求中间件 * 示例1: `@group(method='get', prefix='query', middleware='api_query')` * 示例2: `@group(method='get,post,put,delete', prefix='test')` #### `@env(...)` * `@env('local')` 添加访问环境限制 * 示例1: @env('local') local环境生效 * 示例2: @env(all) 所有环境生效 * 示例3: @env(local, develop, feature) [local,develop,feature]环境生效 #### `@prefix(...)` * `@prefix('string')` 添加请求前缀 * 示例: @prefix('test') #### `@middleware(...)` * `@middleware('array')` 添加请求中间件 * 示例1: `@middleware('api')` * 示例2: `@middleware('api, query')` #### `@any(...)` * `@any()` 添加restful定义,等同于`@method('get,post,put,delete,...')` * `@any(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@any()` * 示例2: `@any(prefix='api', middleware='api')` #### `@restful(...)` * `@restful()` 添加restful定义,等同于`@method('get,post,put,delete')` * `@restful(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@restful()` * 示例2: `@restful(prefix='api', middleware='api')` #### `@get(...)` * `@get()` * `@get(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@get()` * 示例2: `@get(prefix='api', middleware='api')` #### `@post(...)` * `@post()` * `@post(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@post()` * 示例2: `@post(prefix='api', middleware='api')` #### `@put(...)` * `@put()` * `@put(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@put()` * 示例2: `@put(prefix='api', middleware='api')` #### `@delete(...)` * `@delete()` * `@delete(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@delete()` * 示例2: `@delete(prefix='api', middleware='api')` ## Function Annotation Tag #### `@uri(...)` * `@uri('array')` 添加请求地址 * 示例1: @uri('test') * 示例2: @uri('test1, test2') 将生成两个地址: xxx/test1 xxx/test2 #### `@name(...)` * `@name('string')` 添加别名 * 示例 @name('test') #### `@des(...)` * `@des('路由描述')` 生成路由文件的路由描述 * 示例1: @env('请求测试') #### `@env(...)` * `@env('local')` 添加访问环境限制 * 示例1: @env('local') local环境生效 * 示例2: @env(all) 所有环境生效 * 示例3: @env(local, develop, feature) [local,develop,feature]环境生效 #### `@prefix(...)` * `@prefix('string')` 添加请求前缀 * 示例: @prefix('test') #### `@middleware(...)` * `@middleware('array')` 添加请求中间件 * 示例1: `@middleware('api')` * 示例2: `@middleware('api, query')` #### `@any(...)` * `@any()` 添加restful定义,等同于`@method('get,post,put,delete,...')` * `@any(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@any()` * 示例2: `@any(prefix='api', middleware='api')` #### `@restful(...)` * `@restful()` 添加restful定义,等同于`@method('get,post,put,delete')` * `@restful('uri[array]')` 添加restful定义,并添加uri访问地址 * `@restful(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@restful()` * 示例2: `@restful(prefix='api', middleware='api')` * 示例3: `@restful('test')` #### `@get(...)` * `@get()` * `@get('uri[array]')` * `@get(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@get()` * 示例2: `@get(prefix='api', middleware='api')` * 示例3: `@egt('test')` #### `@post(...)` * `@post()` * `@post('uri[array]')` * `@post(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@post()` * 示例2: `@post(prefix='api', middleware='api')` * 示例3: `@post('test')` #### `@put(...)` * `@put()` * `@put('uri[array]')` * `@put(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@put()` * 示例2: `@put(prefix='api', middleware='api')` * 示例3: `@put('test')` #### `@delete(...)` * `@delete()` * `@delete('uri[array]')` * `@delete(xxx='xxx',xxx='xxx',...)` * `prefix`[string] : 前缀 * `middleware`[array] : 请求中间件 * 示例1: `@delete()` * 示例2: `@delete(prefix='api', middleware='api')` * 示例3: `@delete('test')` ### 四、拓展 [top](#lann-route) 1. 实现`Calject\LannRoute\Contracts\AnnotationTagInterface`接口或者继承`Calject\LannRoute\Contracts\AbsAnnotationTag`抽象类, 参考`src/Components/Tag/`目录下的tag实现 2. 在`AnnotationRoute`中注册 * 示例 ```php doRoutes($route, $params); } /** * tag过滤参数(数组或者为空) * @return array|mixed|null|void */ public function tagParams() { return ['middleware', 'uri', 'method']; } /** * 作用范围, 可选: class, function * @return array|string */ public function scope() { return RouteConstant::SCOPE_FUNCTION; } } ``` * 注册 ```php // 添加注解实现 $annotationRoute = new AnnotationRoute(); $annotationRoute->register(new Tag()); $annotationRoute->mapRefRoutes(); ``` * 使用 ```php