
简单、快速且非常实用。 minasrouter是一个用于 MVC 项目的 PHP 路由组件!它抽象了 RESTfull 动词
(GET, POST, PUT, PATCH, DELETE)并在应用程序控制器中以简单易用的方式呈现。
minasrouter独立地工作和处理所有信息,使开发人员的流程更轻松,并加速项目的开发/进度。
简单、快速且非常实用。 minasrouter是一个用于 MVC 项目的 PHP 路由组件!它旨在抽象 RESTfull(GET、POST、PUT、PATCH、DELETE)动词,并在应用程序控制器中简单轻松地呈现它们。
minasrouter独立地工作和处理所有信息,为开发人员简化流程并加速项目的开发/进度。
(Yes, it really is a few minutes)有了两条线,您就可以开始使用路线了!
也许你是一个边看边学的人,你可以访问 example 文件夹,其中包含我们如何使用minasrouter文件夹架构示例。
您可以在此处检查完成的所有测试。享受!
minasrouter可通过Composer require获得:
" require " {
"nicollassilva/ minasrouter " : " ^1.0 "
}或在终端中运行:
composer require nicollassilva/ minasrouter要开始使用minasrouter ,所有导航管理必须重定向到系统的默认路由文件,该文件将执行整个路由处理过程并返回默认配置的内容。根据下面的示例并根据您的服务器进行配置。
要开始使用minasrouter ,所有导航管理必须重定向到系统的默认路由文件,该文件将执行整个路由处理过程并返回默认配置的内容。根据下面的示例并根据您的服务器进行配置。
RewriteEngine on
Options All -Indexes
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} (www.)?localhost
RewriteRule (.*) https:// %{HTTP_HOST} [L,R=301]
RewriteCond %{REQUEST_URI} !public/
RewriteRule (.*) /public/$1 [L] RewriteEngine On
# Options All -Indexes
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# URL Rewrite
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=/$1 [L,QSA]
# ## Do not use the settings below if you are using developing in a local environment, use only in production.
# # WWW Redirect
# RewriteCond %{HTTP_HOST} !^www. [NC]
# RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# # HTTPS Redirect
# RewriteCond %{HTTP:X-Forwarded-Proto} !https
# RewriteCond %{HTTPS} off
# RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
location / {
if ( $script_filename !~ "-f" ){
rewrite ^(.*)$ /index.php?route=/ $1 break;
}
}启动组件:
<?php
require __DIR__ . " /../vendor/autoload.php " ;
use minasrouter Router Route ;
// The second argument is optional. It separates the Controller and Method from the string
// Example: "Controller@method"
Route:: start ( " http://yourdomain.com " , " @ " );
Route:: get ( " / " , function () {
// ...
});
// ... all routes here
// You will put all your routes before this function
Route:: execute ();方法:
| 功能 | 范围 | 范围 | 范围 |
|---|---|---|---|
| 得到 | 字符串 $uri | $回调 | |
| 邮政 | 字符串 $uri | $回调 | |
| 放 | 字符串 $uri | $回调 | |
| 修补 | 字符串 $uri | $回调 | |
| 删除 | 字符串 $uri | $回调 | |
| 匹配 | 数组 $httpVerbs | 字符串 $uri | $回调 |
| 任何 | 字符串 $uri | $回调 |
例子:
Route:: get ( ' /users ' , [ App Controllers User::class, ' index ' ]);
Route:: post ( ' /users ' , [ App Controllers User::class, ' store ' ]);
Route:: put ( ' /users/{id} ' , [ App Controllers User::class, ' update ' ]);
Route:: patch ( ' /users/{id} ' , [ App Controllers User::class, ' update ' ]);
Route:: delete ( ' /users/{id} ' , [ App Controllers User::class, ' delete ' ]);
// The router allows you to register routes that respond to any HTTP verb:
Route:: any ( ' / ' , function () {
// ...
});
// Sometimes you may need to register a route that responds to multiple HTTP verbs:
Route:: match ([ " GET " , " POST " ], " / " , function () {
// ...
});方法:
| 功能 | 范围 |
|---|---|
| 姓名 | 字符串$名称 |
| 到 | 字符串$名称 |
例子:
Route:: get ( " /users/create " , function () {
// ...
})-> name ( " user.create " );
Route:: get ( " /users/2 " , function () {
// ...
})-> as ( " user.show " );Route:: get ( " / " , function () {
// ...
})-> name ( " web.index " );
Route:: get ( " /user/{id} " , function ( $ id ) {
echo $ id ;
})-> name ( " user.show " );
Route:: get ( " /post/{id?} " , function ( $ id ) {
if (! $ id ) {
// ...
}
// ...
})-> name ( " post.show " );方法:
| 功能 | 范围 | 范围 |
|---|---|---|
| 在哪里 | 数组 $params | |
| 其中参数 | 字符串 $param | 字符串$正则表达式 |
| 其中编号 | 字符串 $param | |
| 其中阿尔法 | 字符串 $param | |
| 其中字母数字 | 字符串 $param | |
| 所在位置 | 字符串 $param |
例子:
Route:: get ( " /user/{id} " , [ App Controllers UserController::class, " show " ])
-> name ( " user.show " )
-> where ([ " id " => " [0-9]+ " ]);
// whereParam is alias of where method
Route:: get ( " /profile/{slug} " , [ App Controllers UserController::class, " profile " ])
-> name ( " user.profile " )
-> whereParam ( " id " , " [0-9]+ " );
Route:: get ( " /book/{id} " , [ App Controllers BookController::class, " show " ])
-> name ( " book.show " )
-> whereNumber ( " id " );使用中间件非常简单,我们只需要传递类的全名或将它们设置为全局,然后我们使用它们的别名。
注意:将所有路线放置在下面非常重要。此类之上的路由不会将这些中间件作为全局的。
Route:: globalMiddlewares ([
' isLogged ' => App Middlewares isLogged::class,
' isAdmin ' => App Middlewares isAdmin::class
]);
// ... all routes您可以使用 middleware 方法将中间件分配给路由。
Route:: get ( " /musics " , function () {
// ...
})-> middleware ( " isLogged " );
Route:: get ( " /musics " , function () {
// ...
})-> middleware ([ " isLogged " ]);您可以通过将中间件名称数组传递给中间件方法来将多个中间件分配给路由。
Route:: get ( " /musics " , function () {
// ...
})-> middleware ( " first, second " );
Route:: get ( " /movies " , function () {
// ...
})-> middleware ([ " first " , " second " ]);分配中间件时,您还可以传递完全限定的类名:
use App Middlewares VerifyCsrfToken ;
Route:: get ( " /series " , function () {
// ...
})-> middleware (VerifyCsrfToken::class);
Route:: get ( " /series " , function () {
// ...
})-> middleware ( App Middlewares VerifyCsrfToken::class);有时您使用中间件创建一组路由,但您只希望一个或几个路由没有特定的中间件,您可以这样做。
Route:: middleware ([ ' auth ' , ' api ' ])-> group ( function () {
Route:: get ( ' / ' , function () {
// All middlewares will works in this route
});
Route:: get ( ' /no-api ' , function () {
// Only the auth middleware works here
})-> withoutMiddleware ( ' api ' );
});所有方法:
| 功能 | 范围 | ::功能 | ->功能 |
|---|---|---|---|
| 名称空间 | 字符串$命名空间 | 是的 | 是的 |
| 前缀 | 字符串$前缀 | 是的 | 是的 |
| 姓名 | 字符串$名称 | 是的 | 是的 |
| 中间件 | 字符串$中间件 | 是的 | 是的 |
组方法可以以静态方式或普通方式调用,不要忘记调用函数组以作为路由插入闭包内。
示例:
Route:: name ( " admin. " )-> group ( function () {
Route:: get ( " / " , function () {
// admin.index
})-> name ( " index " );
});Route:: prefix ( " admin/ " )-> group ( function () {
Route:: get ( " /index " , function () {
// http://localhost/admin/index
})-> name ( " index " );
});Route:: namespace ( " AppControllers " )-> group ( function () {
Route:: get ( " /user/{id} " , [ " User " , " show " ])-> name ( " show " );
// AppControllersUser
});Route:: middleware ( App Middlewares isLogged::class)-> group ( function () {
Route:: get ( " /user/{id} " , [ " User " , " show " ])-> name ( " show " );
});Route:: namespace ( " AppControllersAdmin " )
-> middleware ([ " isLogged " , " isAdmin " ])
-> name ( " admin. " )
-> prefix ( " admin " )
-> group ( function () {
// ...
});您可以将路由与路由组中的各个中间件一起使用。
Route:: namespace ( " isLogged " )-> group ( function () {
Route:: get ( " /posts " , function () {
// ...
})-> middleware ( " isAdmin " );
// ...
});也许您想要一条忽略组名称的路由,您可以使用 name 方法的第二个参数。
Route:: name ( " admin. " )-> group ( function () {
Route:: get ( " /posts " , function () {
// name: app.posts
})-> name ( " app.posts " , true );
});方法:
| 功能 | 范围 | 范围 | 范围 |
|---|---|---|---|
| 重定向 | 字符串 $uri | 字符串$重定向 | 整数 $statusCode = 302 |
| 永久重定向 | 字符串 $uri | 字符串$重定向 |
例子:
// Returns 302 status code by default.
Route:: redirect ( " /here " , " /there " );
Route:: redirect ( " /here " , " /there " , 301 );
// permanentRedirect always returns 301
Route:: permanentRedirect ( " /here " , " /there " );
// You can return an existing route
Route:: redirect ( " /index " , " web.index " );当没有使用该 url 地址注册的路由时,将由后备路由负责。当用户没有请求任何路由时,就会调用回退路由。
Route:: fallback ( function () {
echo ' Route error! ' ;
// ...
});注意:如果要重定向到现有路由,请小心,如果它包含动态参数,它将返回整个正则表达式并会导致错误。
请小心重定向到现有路由,因为如果它具有动态参数,它将返回整个正则表达式并返回错误。
每次调用路由以及调用 Closure 或控制器方法时,您都会将 minasrouter HttpRequest 的实例作为参数。如果路由有动态参数(强制或可选),则需要在接收 Request 实例之前传递它们。
| 功能 | 范围 | 范围 |
|---|---|---|
| 获取参数 | ||
| 小路 | ||
| 网址 | ||
| 完整网址 | ||
| 标头 | 字符串 $header | 字符串$默认值 |
| 有标题 | 字符串 $header | |
| ip | ||
| 询问 | ?字符串$查询 | ?字符串$默认值 |
| 全部 | ?字符串$例外 | |
| 获取方法 | ||
| 方法 | 字符串 $expectedMethod |
路由的动态参数直接与Request实例一起传入方法中。
例子:
use minasrouter Http Request ;
Route:: get ( " / " , function ( Request $ request )) {
// ...
});
Route:: get ( " /user/{id} " , function ( $ id , Request $ request )) {
// ...
});
Route:: get ( " /posts/{slug?} " , function ( $ slug , Request $ request )) {
// ...
});
Route:: get ( " /book/{slug} " , function ( $ slug , Request $ request ) {
// Retrieving all dynamic parameters
print_r ( $ request -> getParams ());
});Request 方法是包含所有表单数据、查询参数、动态路由参数和整个请求标头的方法。
path方法返回请求的路径信息。因此,如果传入请求的目标是http://localhost/foo/bar ,则 path 方法将返回foo/bar :
$ uri = $ request -> path ();要检索传入请求的完整 URL,您可以使用url或fullUrl方法。 url方法将返回不带查询字符串的 URL,而fullUrl方法包含查询字符串:
$ url = $ request -> url ();
$ urlWithQueryString = $ request -> fullUrl ();您可以使用 header 方法从 minasrouter HttpRequest实例检索请求标头。如果请求中不存在标头,则将返回 null。但是, header 方法接受可选的第二个参数,如果请求中不存在标头,则将返回该参数:
$ value = $ request -> header ( " Header-Name " );
$ value = $ request -> header ( " Header-Name " , " default " );hasHeader方法可用于确定请求是否包含给定的标头:
if ( $ request -> hasHeader ( " Header-Name " )) {
// ...
}bearerToken方法可用于从授权标头中检索承载令牌。如果不存在这样的标头,则将返回 null。
$ token = $ request -> bearerToken ();ip方法可用于检索向您的网站发出请求的客户端的 IP 地址:
$ ipAddress = $ request -> ip ();查询方法只会从查询字符串中检索值:
$ id = $ request -> query ( " id " );如果请求的查询字符串值数据不存在,则将返回此方法的第二个参数:
$ developer = $ request -> query ( " developer " , " Nicollas " );您可以调用不带任何参数的查询方法来检索所有查询字符串值。
$ query = $ request -> query ();您可以直接访问 queryString 并输入数据,这是 Request 类的属性。
// http://localhost/?foo=bar
$ foo = $ request -> foo ;
// <input type="text" name="title" value=" minasrouter ">
$ title = $ request -> title ;您可以使用 all 方法以数组形式检索所有传入请求的输入数据。无论传入请求是来自 HTML 表单还是 XHR 请求,都可以使用此方法。如果您想使某些数据无效,可以将其作为第二个参数传递。
$ data = $ request -> all ();
// all, except csrf_token, page
$ data = $ request -> all ( " csrf_token, page " );getMethod方法将返回请求的 HTTP 谓词。您可以使用isMethod方法来验证 HTTP 谓词是否与给定字符串匹配:
$ httpMethod = $ request -> getMethod ();
if ( $ request -> isMethod ( ' POST ' )) {
// ...
}