easy-projects / simple-router
PHP创建路由的库。
README
查看完整示例项目: https://github.com/FrederickMontiel/CRUD-SimpleRouter-php
使用composer安装我们的包
composer require easy-projects/simple-router
您必须使用此 .htaccess 重定向所有请求到您的主文件
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
示例代码
<?php include_once __DIR__."/vendor/autoload.php"; use EasyProjects\SimpleRouter\Router as Router; $router = new Router(); /* Import only the packages and classes that you are using. Improves application loading performance. For this you need to gestione your project by packages. */ $router->autoload(); //Cors rules for the browser $router->cors()->setAllowedOrigins("https://easyprojects.tech/", "localhost"); $router->cors()->setAllowedMethods("GET", "POST", "PUT", "DELETE"); $router->cors()->setAllowedHeaders("Content-Type", "Authorization"); //Routes $router->get("/get/{idUser}", //Middlewares for example fn () => Middleware::auth(), //Controller fn () => Router::$response->status(200)->send(Router::$request->params->idUser) ); $router->post("/add", fn () => Router::$response->status(200)->send(Router::$request->body->nameUser) ); $router->put("/update/{idUser}", fn () => Router::$response->status(200)->send(Router::$request->params->idUser." - ".Router::$request->body->nameUser) ); $router->delete("/delete/{idUser}", fn () => Router::$response->status(200)->send(Router::$request->params->idUser." - ".Router::$request->body->nameUser) ); //Use only in development $router->start();
对于文件,您可以这样做
$router->post("/upload/folder/{idFolder}", fn () => Router::$response->status(200)->send(Router::$request->files->img->name." - ".Router::$request->params->idFolder) );
它是如何工作的?
它由3个类组成,Router,Request,Response。
Router是一个全局类,可以设计路由,您可以将不同的方法放入其中:get、post、put、delete。Request包含客户端浏览器或客户端发送的数据(URL或表单参数和头部)。Response包含两个方法,status用于发送响应代码(404、500、403),send()发送一个json对象作为响应。
$router = new Router();
这是一个Router
类的实例,它允许包含所有路由信息并对其执行$router->start();
函数。
$router->start();
与人们想象的相反,$router->start();
类只用于在没有找到任何匹配路由的情况下返回404。
$router->autoload();
$router->autoload();
方法用于基于包的项目。
看下面的图片中的命名空间
现在看看文件夹结构。
请注意,类中使用的相同名称必须与文件中使用的相同,也就是说,如果你的类是ExampleController
,则文件必须是ExampleController.php
,在包的命名空间结构中,因此文件必须在以下路径中:App/Controllers/ExampleController.php
,从你的index开始。
现在,如果您使用require
或include
导入文件,则不需要使用此功能,尽管需要注意的是代码将不会被优化,并且会慢得多,因为加载了项目中使用的所有类,而不是在需要时才加载。
$router->cors();
什么是cors?它是一个安全层,让我给你举个例子
想象一下,有人有恶意意图,并试图从他们制作的网页上对您的php api发起请求,假设您有mydomain.com
域名,攻击者有domainatacker.com
域名,让我们更进一步,假设您有很多关于宝可梦的信息,如pokeapi
,您通过您的ApiREST反映了这些信息,现在想象一下,攻击者可以使用您的api响应的信息在其网站上,这消耗了您的资源,并使您失去客户,因为其他人正在使用您存储在api中的信息,并且客户以更低的成本或免费获得您的服务,这导致企业亏损。
(这仅适用于执行javascript以进行http请求的浏览器,也就是说,如果从某个本地服务如curl
进行本地请求,则可以无问题进行请求)
Cors规则(Cors rules)就是预防这种情况的
$router->cors()->setAllowedOrigins();
$router->cors()->setAllowedOrigins
方法允许您告诉客户端浏览器,“如果它们从以下域名发送请求,就让他们通过并继续执行其他操作。”。
参数数量是无限的,因此您可以添加无限个域名。
$router->cors()->setAllowedOrigins("https://easyprojects.tech/", "localhost");
请注意,如果您使用不带参数的方法,您正在告诉浏览器接受任何域名的请求
$router->cors()->setAllowedOrigins();
另外一点需要考虑的是,例如,如果您只添加 $router->cors()->setAllowedOrigins("localhost");
,那么您正在表示本地主机的任何端口都可以访问API的资源。也就是说,"localhost:80"
,"localhost:3000"
,"localhost:4200"
以及所有其他 "localhost:any"
和无论是否使用 http
或 https
协议,都可以向您的API发起请求。
这里的意思是,当您执行 $router->cors()->setAllowedOrigins("easyprojects.tech");
时,请务必小心,因为如果有人创建了以 "easyprojects.tech" 为结尾的任何文本的域名,即如果有人创建了域名 aeasyprojects.tech
,那么它也可以访问您的API。同样,如果根据前面的建议添加了协议 http
或 https
,即 $router->cors()->setAllowedOrigins("https://easyprojects.tech");
,如果有人创建了域名 'easyprojects.techa',那么它也可以访问,因为检查的是来源是否包含 easyprojects.tech
,因此我强烈建议您完全按照这种方式评估完整路径:$router->cors()->setAllowedOrigins("https://easyprojects.tech/");
$router->cors()->setAllowedMethods();
此方法可以接受HTTP方法的参数,即可以告诉浏览器不要阻止使用该方法发送的任何请求
$router->cors()->setAllowedMethods("GET", "POST", "PUT", "DELETE");
这里告诉浏览器,允许所有使用GET、POST、PUT和DELETE方法发送的请求通过
$router->cors()->setAllowedMethods();
有一些浏览器默认阻止的头部,即浏览器默认不允许更改请求的来源,但是如果您将其添加到这里,那么如果允许了 Access-Control-Allow-Origin
头部,那么它将接受来源可以更改
//不推荐这样做。 $router->cors()->setAllowedHeaders("Access-Control-Allow-Origin");
方法
方法是从PHP端接收数据的方式,客户端计算机以特定方式发送的数据,最常见的有
GET, POST, PUT, DELETE。
GET
https://easyprojects.tech/Categories?id=1¶m=eeeeee
仅用于返回信息。
$router->body
总是空的,因为默认情况下GET没有请求体,浏览器和库都不允许发送带有请求体的HTTP GET请求。
POST
https://easyprojects.tech/Category
仅用于将信息添加到数据库和上传文件到服务器或使用的其他服务。
可以使用以下代码获取文件:Router::$request->files
,可以使用 Router::$request->files->archivo
获取以 "archivo" 为键上传的文件,依次类推。
PUT
https://easyprojects.tech/Category
仅用于更新信息(不能上传文件)。
DELETE
仅用于删除信息。
所有方法都可以使用 Router::$request->headers
、Router::$request->query
、Router::$request->body
和 Router::$request->params
。只有 POST
方法会在 Router::$request->files
中包含信息。
$router->get(); $router->post(); $router->put(); $router->delete();
这些方法中的任何一个都可以在router中注册一个路由,以便进行评估,方法需要一个参数来指定要注册的路径,以及无限多个执行方法的参数,即
参数 1
-> /Categories
参数 (2 或更多,直到无限)
-> fn() => MethodToExecute()
.
示例
$router->get( "/Categories", //<-- Primer parametro fn () => MethodOne(), //<-- Segundo parametro fn () => MethodTwo(), //<-- Tercer parametro //... hacia el infinito fn () => MethodInfinite(), //<-- Ultimo parámetro parametro );
POST、PUT、DELETE 也使用相同的原理。
有任何疑问或咨询,您都可以通过邮箱 fmontiel@easyprojects.tech
联系我。