Cet article vous apporte des connaissances pertinentes sur thinkphp, qui présente principalement des problèmes liés à la définition de routage et aux règles pseudo-statiques. J'espère qu'il sera utile à tout le monde.
Étude recommandée : "Tutoriel vidéo PHP"
Pensez aux règles pseudo-statiques de définition d'itinéraire PHP 6.0
Pour utiliser la classe Route
pour enregistrer une route, vous devez d'abord ajouter un référence au début du fichier de définition d'itinéraire (l'explication ne sera pas répétée plus tard) Route
类注册路由必须首先在路由定义文件开头添加引用(后面不再重复说明)
use think\facade\Route;
最基础的路由定义方法是:
Route::rule('路由表达式', '路由地址', '请求类型');
例如注册如下路由规则(假设为单应用模式):
// 注册路由到News控制器的read操作 Route::rule('new/:id','News/read');
我们访问:
http://serverName/new/5
会自动路由到:
http://serverName/news/read/id/5
并且原来的访问地址会自动失效。
可以在rule
方法中指定请求类型(不指定的话默认为任何请求类型有效),例如:
Route::rule('new/:id', 'News/update', 'POST');
请求类型参数不区分大小写。
表示定义的路由规则在POST
请求下才有效。如果要定义GET
和POST
Route::rule('new/:id','News/read','GET|POST');
Route::rule('Expression d'itinéraire', 'Adresse de routage', 'Type de demande');Par exemple, enregistrez la règle de routage suivante (en supposant le mode d'application unique) :
Vous pouvez spécifier le type de requête dans la méthode Route::get('new/<id>','News/read'); // 定义GET请求路由规则 Route::post('new/<id>','News/update'); // 定义POST请求路由规则 Route::put('new/:id','News/update'); // 定义PUT请求路由规则 Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则 Route::any('new/:id','News/read'); // 所有请求都支持的路由规则Copier après la connexionCopier après la connexionNotre visite : Route::rule('/', 'index'); // 首页访问路由 Route::rule('my', 'Member/myinfo'); // 静态地址路由 Route::rule('blog/:id', 'Blog/read'); // 静态地址和动态地址结合 Route::rule('new/:year/:month/:day', 'News/read'); // 静态地址和动态地址结合 Route::rule(':user/:blog_id', 'Blog/read'); // 全动态地址Copier après la connexionCopier après la connexionsera automatiquement acheminé vers : Route::get('blog/:year/[:month]','Blog/archive'); // 或者 Route::get('blog/<year>/<month?>','Blog/archive');Copier après la connexionCopier après la connexionet la visite originale L'adresse expirera automatiquement. rule
(s'il n'est pas spécifié, tout type de requête sera valide par défaut), par exemple :http://serverName/index.php/blog/2015 http://serverName/index.php/blog/2015/12Copier après la connexionCopier après la connexionLes paramètres de type de requête ne sont pas cas -sensible.signifie que les règles de routage définies ne sont valables que sous les requêtes POST
. Si vous souhaitez définir des règles de routage supportées par les requêtesGET
etPOST
, vous pouvez utiliser :Route::get('new/:cate$', 'News/category');Copier après la connexionCopier après la connexionCependant, nous recommandons généralement d'utiliser des méthodes de raccourci correspondant au type de requête, notamment : Type Description Méthode de raccourci GET GET request get POST POST request post PUT Demande PUT "put" n'importe lequel 快捷注册方法的用法为:
Route::快捷方法名('路由表达式', '路由地址');
使用示例如下:
Route::get('new/<id>','News/read'); // 定义GET请求路由规则 Route::post('new/<id>','News/update'); // 定义POST请求路由规则 Route::put('new/:id','News/update'); // 定义PUT请求路由规则 Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则 Route::any('new/:id','News/read'); // 所有请求都支持的路由规则Copier après la connexionCopier après la connexion注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始执行最终的调度方法,后续规则就不再检测。
规则表达式
规则表达式通常包含静态规则和动态规则,以及两种规则的结合,例如下面都属于有效的规则表达式:
Route::rule('/', 'index'); // 首页访问路由 Route::rule('my', 'Member/myinfo'); // 静态地址路由 Route::rule('blog/:id', 'Blog/read'); // 静态地址和动态地址结合 Route::rule('new/:year/:month/:day', 'News/read'); // 静态地址和动态地址结合 Route::rule(':user/:blog_id', 'Blog/read'); // 全动态地址Copier après la connexionCopier après la connexion规则表达式的定义以
/
为参数分割符(无论你的PATH_INFO
分隔符设置是什么,请确保在定义路由规则表达式的时候统一使用/
进行URL参数分割,除非是使用组合变量的情况)。每个参数中可以包括动态变量,例如
:变量
或者<变量>
都表示动态变量(新版推荐使用第二种方式,更利于混合变量定义),并且会自动绑定到操作方法的对应参数。你的URL访问
PATH_INFO
分隔符使用pathinfo_depr
配置,但无论如何配置,都不影响路由的规则表达式的路由分隔符定义。可选变量
支持对路由参数的可选定义,例如:
Route::get('blog/:year/[:month]','Blog/archive'); // 或者 Route::get('blog/<year>/<month?>','Blog/archive');Copier après la connexionCopier après la connexion变量用
[ ]
包含起来后就表示该变量是路由匹配的可选变量。以上定义路由规则后,下面的URL访问地址都可以被正确的路由匹配:
http://serverName/index.php/blog/2015 http://serverName/index.php/blog/2015/12Copier après la connexionCopier après la connexion采用可选变量定义后,之前需要定义两个或者多个路由规则才能处理的情况可以合并为一个路由规则。
可选参数只能放到路由规则的最后,如果在中间使用了可选参数的话,后面的变量都会变成可选参数。
完全匹配
规则匹配检测的时候默认只是对URL从头开始匹配,只要URL地址开头包含了定义的路由规则就会匹配成功,如果希望URL进行完全匹配,可以在路由表达式最后使用
$
符号,例如:Route::get('new/:cate$', 'News/category');Copier après la connexionCopier après la connexion这样定义后
http://serverName/index.php/new/infoCopier après la connexion会匹配成功,而
http://serverName/index.php/new/info/2Copier après la connexion则不会匹配成功。
如果是采用
Route::get('new/:cate', 'News/category');Copier après la connexion方式定义的话,则两种方式的URL访问都可以匹配成功。
如果需要全局进行URL完全匹配,可以在路由配置文件中设置
// 开启路由完全匹配 'route_complete_match' => true,Copier après la connexion开启全局完全匹配后,如果需要对某个路由关闭完全匹配,可以使用
Route::get('new/:cate', 'News/category')->completeMatch(false);Copier après la connexion额外参数
在路由跳转的时候支持额外传入参数对(额外参数指的是不在URL里面的参数,隐式传入需要的操作中,有时候能够起到一定的安全防护作用,后面我们会提到)。例如:
Route::get('blog/:id','blog/read') ->append(['status' => 1, 'app_id' =>5]);Copier après la connexion上面的路由规则定义中
status
和app_id
参数都是URL里面不存在的,属于隐式传值。可以针对不同的路由设置不同的额外参数。如果
append
方法中的变量和路由规则存在冲突的话,append方法传入的优先。路由标识
如果你需要快速的根据路由生成URL地址,可以在定义路由的时候指定生成标识(但要确保唯一)。
例如
// 注册路由到News控制器的read操作 Route::rule('new/:id','News/read') ->name('new_read');Copier après la connexion生成路由地址的时候就可以使用
url('new_read', ['id' => 10]);Copier après la connexion如果不定义路由标识的话,系统会默认使用路由地址作为路由标识,例如可以使用下面的方式生成
url('News/read', ['id' => 10]);Copier après la connexion强制路由
在路由配置文件中设置
'url_route_must' => true,Copier après la connexion将开启强制使用路由,这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。
首页的路由规则采用
/
定义即可,例如下面把网站首页路由输出Hello,world!
Route::get('/', function () { return 'Hello,world!'; });Copier après la connexion推荐学习:《PHP视频教程》
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!