easy-projects/simple-router

该软件包最新版本(v7.6.1)没有可用的许可信息。

PHP创建路由的库。

v7.6.1 2024-07-10 01:36 UTC

This package is auto-updated.

Last update: 2024-09-15 02:48:21 UTC


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();方法用于基于包的项目。

image

看下面的图片中的命名空间

image

现在看看文件夹结构。

image

请注意,类中使用的相同名称必须与文件中使用的相同,也就是说,如果你的类是ExampleController,则文件必须是ExampleController.php,在包的命名空间结构中,因此文件必须在以下路径中:App/Controllers/ExampleController.php,从你的index开始。

现在,如果您使用requireinclude导入文件,则不需要使用此功能,尽管需要注意的是代码将不会被优化,并且会慢得多,因为加载了项目中使用的所有类,而不是在需要时才加载。

$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" 和无论是否使用 httphttps 协议,都可以向您的API发起请求。

这里的意思是,当您执行 $router->cors()->setAllowedOrigins("easyprojects.tech"); 时,请务必小心,因为如果有人创建了以 "easyprojects.tech" 为结尾的任何文本的域名,即如果有人创建了域名 aeasyprojects.tech,那么它也可以访问您的API。同样,如果根据前面的建议添加了协议 httphttps,即 $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&param=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->headersRouter::$request->queryRouter::$request->bodyRouter::$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 联系我。