dspaccapeli/file-based-router

一个简单的基于文件的路由器,可以轻松地从目录中提供服务端点。

1.0.0 2023-01-24 14:41 UTC

This package is auto-updated.

Last update: 2024-09-24 21:37:37 UTC


README

File-based Router

基于文件的Router

一个简单的基于文件的Router,可以自动将请求路由到目录中的文件

简介

这个 基于文件的Router 是一个用PHP编写的简单路由系统,允许开发者轻松地处理PHP项目的URL路由。它使用基于文件的路由规则将URL映射到特定的控制器或函数,这使得添加新路由和修改现有路由变得非常容易。

这个路由器轻量级,易于设置,可以与任何PHP框架或CMS无缝工作。它由约 20 行代码 的单个路由函数组成,可以在几分钟内理解。

此仓库包装了该软件包,使其可以通过Composer轻松安装。如果您想直接使用此函数,可以直接将其复制到您的源代码中。此README文件提供了在PHP项目中安装、配置和使用基于文件的路由器的所有必要信息。

开始使用

首先,通过Composer包管理器安装基于文件的路由器

composer require dspaccapeli/file-based-router

然后,要将其用于您的项目,只需在您的入口点(通常是index.php文件)中调用Composer自动加载器和route函数

// Import the Composer autoloader
require __DIR__ . '/../vendor/autoload.php';

// Prepare the router
$url_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // e.g. "/" or "/home" or "/api/users"
$directory_path = 'insert here the absolute path to the directory containing the endpoints';

// Route the request
FileBasedRouter::route($url_path, $directory_path);

如果这是您的文件夹结构

├── www
│   └── index.php
└── controllers
    ├── home.php
    └── api
        └── users.php

那么$endpoints_abs_path变量应设置为__DIR__ . "/../controllers/"

require __DIR__ . '/../vendor/autoload.php';

// Routing
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$endpoints_abs_path = 'insert here the absolute path to the directory containing the endpoints';

route($path, $endpoints_abs_path, function($path){
    return str_contains($path, '.');
}, $return_404, '.view');

FileBasedRouter::route($path, __DIR__ . "/../hello/");

关于import作用域的说明

如果您想从控制器文件中访问在入口点/index文件中通过requireimport导入的对象(我将交替使用这些术语),您需要小心它们的作用域

在入口点/index文件中required的变量在控制器文件中不可用。route只是在入口点/index文件中调用的函数,常规的作用域规则适用。因此,需要在控制器文件中也重新required变量。对于函数来说,这是不正确的,它们将在控制器文件中可用。

我建议在每个控制器文件中每次都定义相关的导入和required对象,以使它们更明确。这对维护性更好,使开发人员可以清楚地了解可用的内容,并有助于某些linting系统。在这种情况下,您可以使用require_onceimport_once,而不用担心变量的作用域。

请注意,这只是其中一种方法。还有多种解决导入作用域的方法,这只是其中之一。

用法

route参数

> $url_path

它是要路由的URL的路径。它必须是一个string

> $controller_path

它是包含端点的目录的绝对路径。它必须是一个string,如果未指定,默认为/var/www/html目录。

> $filter_function

这是一个接受$url_path作为参数并返回布尔值的函数。它可以用来过滤掉一些URL。如果未指定,默认为null

如果该函数对$url_path返回true,则路由器将调用$fallback_handler并返回false

我使用它来过滤掉对视图文件(.view.php)的请求,这些文件不应该直接调用,但为了方便,与控制器文件位于同一位置。

> $fallback_handler

这是在文件/端点不存在时被调用的函数。如果没有指定,默认的失败模式会调用 http_response_code(404)

> $view_suffix

这是视图文件的后缀。如果未指定,默认为 null。如果设置了,路由器也会包含与请求URL对应的视图文件。

在包含控制器文件后,路由器会寻找一个与控制器文件同名,但后缀为 $view_suffix 的文件,如果存在则包含它。

这对于想要将控制器逻辑与视图逻辑分开非常有用。控制器不需要手动调用视图文件。

在控制器中定义的变量将在视图文件中可用。

> $extension

这是控制器文件的后缀。如果未指定,默认为 .php

route 返回

如果路由成功,路由器将包含与请求URL对应的文件并退出脚本并返回 true。如果路由失败,路由器将返回 false,脚本将继续运行。

路由代码

路由器是一个约20行代码的单个函数。它非常容易理解和修改。

请随意将其复制粘贴到您的项目中,并根据您的需要进行修改。如果您想改进它,请为项目做出贡献。

function route (
    string $url_path, 
    string $controller_path = '/var/www/html', 
    ?callable $filter_function = null, 
    ?callable $fallback_handler = null,
    ?string $view_suffix = null,
    string $extension = '.php'
    ) : bool {
        // add index.php to the path if the path is a directory i.e. public/ -> public/index.php
        $url_path = substr($url_path, -1) === '/' ? $url_path . 'index' : $url_path;
        // if function exists and returns false, call fallback handler
        if (isset($filter_function) && $filter_function($url_path)){
            isset($fallback_handler) ? $fallback_handler() : http_response_code(404);
            return false;
        // if file exists redirect there
        } else if (file_exists($controller_path . $url_path . $extension)){
            // if file exists, require it
            require $controller_path . $url_path . $extension;
            if(isset($view_suffix) && file_exists($controller_path . $url_path . $view_suffix . $extension)){
                // if view suffix is set, require the view
                require $controller_path . $url_path . $view_suffix . $extension;
            }
            return true;
        } else {
            // if file doesn't exist, call fallback handler
            isset($fallback_handler) ? $fallback_handler() : http_response_code(404);
            return false;
        }
}

此基于文件的路由器是一个开源软件,受 MIT许可证 的许可。

有关路由器发布的软件许可证的信息,包括使用和分发上的任何限制。