PHP include - 具有更好 URL 的替代


php include - alternative with better url

我想建立一个具有不同视图的网站,但有一个稳定的页眉和页脚 - 到目前为止没有问题。但是我不喜欢目前使用 php GET 方法获得的那种 url。我的网站目前是这样工作的(什么 istn 工作正常):

$_page = $_GET['p'];
if ($_page == "city-sitemap"){ include "views/city-sitemap-view.php"; }
if ($_page == "place"){ include "views/place-view.php"; }

else { include "views/index-view.php";}

这不是一个非常甜蜜的解决方案,但我现在不知道另一个。我尝试使用 mvc 框架,但失败得很惨。所以每次我添加一个链接时,我都会使用例如这个"index.php?p=place" - 不是很好。包括视图也是不是很聪明吗?有没有更好的方法?我想使用类似重写引擎的东西,新网址就像一个文件夹。你能帮我找到更好的解决方案吗?多谢

页面包括

对于页面包含,您可以使用一个简单的数组将页面动态分配给特定名称。如下:

$pages = array('city-sitemap'=>'views/city-sitemap-view.php',
    'place'=>'views/place-view.php',
)
if(array_key_exists($_GET['p'], $pages){
    include $pages[$_GET['p']];
}else{
    include 'views/error.php';
}

此数组应添加到常规配置文件中。使用此配置,如果要显示城市站点地图视图.php视图,则必须编写以下 url:http://www.domain.com/index.php?p=city-sitemap

网址重写

可以使用 .htaccess 文件重写 URL。下面是您可以在 .htaccess 文件中编写的代码示例。

RewriteEngine On
RewriteRule ^(.*)$ index.php?p=$1 [L,QSA]

如下所示的网址:

http://www.domain.com/index.php?p=city-sitemap

将转换为此一个:

http://www.domain.com/city-sitemap

您应该研究一下称为前端控制器的东西。你可以自己写一个非常简单的。它与 URL 重写结合使用。例如,如果您的网址如下所示: /我的页面.html

URL 重写器会将请求重新路由到索引.php .

索引.php 然后查看 URL 并执行以下操作:

1)将页面分解为字符串,忽略.html扩展

 preg_match("'/(.*?)'.html", $_REQUEST['URI'], $matches);
 $pageClass = $matches[1];
 //$pageClass = "mypage"

2) 查找并加载一个名为"Mypage.php"的类

 $controller = new $pageClass();

3) 在页面类上调用 run 方法,向其传递所有请求参数

 $request = new Request($_REQUEST);
 $controller->run($request);

然后,您可以在特定于页面的控制器类中执行所有特定于页面的内容。

在此过程中,每个简单的步骤中,您都会发现想要做越来越多的事情,例如身份验证,过滤,跟踪等。您最终将开发一个特定于您需求的前端控制器,以及一个基本控制器类,该类执行所有控制器共有的一堆标准内容。

根据我的评论,我真的认为你应该考虑我链接的框架(这是非常合乎逻辑的)或任何其他微框架,但如果你真的想自己做这件事,那么你可以像这样处理你的包含:

<?php  //index.php
$requested_page=isset($_GET['p'])?$_GET['p']:'home';
//maybe have this included from pages.php for organization
$pages=array(
    'home'=>'home_content.php',
    'about'=>'about_content.php',
    'contact'=>'contact_content.php'
);
include "views/header.php";
if(array_key_exists($requested_page, $pages)){
    include "views/".$pages[$requested_page];
}else{
    header('HTTP/1.0 404 Not Found');
    include "views/error404.php";
}
include "views/footer.php";

这会将您的页面保留在单个数组中,并防止任意包含漏洞。

有关更好的 URL,请参阅其他用户 .htaccess 重写规则