dspaccapeli / file-based-router
一个简单的基于文件的路由器,可以轻松地从目录中提供服务端点。
This package is auto-updated.
Last update: 2024-09-24 21:37:37 UTC
README
基于文件的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文件中通过require
或import
导入的对象(我将交替使用这些术语),您需要小心它们的作用域。
在入口点/index文件中required的变量在控制器文件中不可用。route
只是在入口点/index文件中调用的函数,常规的作用域规则适用。因此,需要在控制器文件中也重新required变量。对于函数来说,这是不正确的,它们将在控制器文件中可用。
我建议在每个控制器文件中每次都定义相关的导入和required对象,以使它们更明确。这对维护性更好,使开发人员可以清楚地了解可用的内容,并有助于某些linting系统。在这种情况下,您可以使用require_once
或import_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许可证 的许可。
有关路由器发布的软件许可证的信息,包括使用和分发上的任何限制。