PHP 路由 - “干净”包括

问题描述 投票:0回答:1

我有一个 PHP 路由脚本,像这样:

include_once('routing-functions.php');

// pathMatches was imported from routing-functions.php

if(pathMatches('/blog/*')){

    include_once('actual-script.php');

}

我遇到的问题如下:

routing-functions.php
中的函数和全局变量可能与包含的文件发生冲突。此外,我不希望
actual-script.php
访问路由器的任何变量。

我正在寻找一种完全擦除 PHP 上下文的方法,以便像直接请求文件一样包含文件,所以执行以下操作不是一个选项,因为它会更改执行

actual-script.php
的上下文/范围:

if(pathMatches('/blog/*')){

    $sandbox = function(){

        include_once('actual-script.php');

    };

    $sandbox();

}

此外,向文件发送本地请求(例如使用 cURL)也不是一种选择,因为它对性能有负面影响,我希望它像在

/blog/
URL 下一样运行。

使用 .htaccess 很容易解决问题,但是,我需要一个使用 PHP 路由器的动态解决方案。

如果有人以前遇到过类似问题或知道好的解决方案,将不胜感激。

php apache .htaccess routes
1个回答
0
投票

我不确定您对包容性有何担忧。您包含的任何内容都像运行脚本的一部分一样运行。函数看不到全局变量,除非你用 global 关键字专门将它们注入它。

如果你的问题是你的路由代码正在改变全局状态,那么问题就变成了——为什么他们这样做只是为了提供路由?

许多项目都采用了Symfony Http Foundation 组件来包装 HTTP 协议中涉及的所有重要的超级全局变量,这是您可以提供隔离的一种方式。鉴于许多 php 项目广泛采用此组件,我强烈建议您认真研究它。

就这么简单

use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals();

至于防止函数的名称冲突,只需使用 php 命名空间即可。

namespace yourname {
   function foo() {
       echo "yourname foo";
   }

   // rest of your functions
}

给他们打电话:

yourname/foo();
© www.soinside.com 2019 - 2024. All rights reserved.