之前我问过这样的问题,但由于我仍然无法找到答案,我会再次提出问题:-s。
我正在使用这个非常基本的模板'脚本:
require_once 'core/init.php';
if(empty($_GET['page'])){
header('Location: home');
die();
}
$basePath = dirname(__FILE__) . '/';
$viewPath = $basePath . 'view/';
$view = scandir($viewPath);
foreach($view as $file)
{
if (!is_dir($viewPath . $file))
{
$pages[] = substr($file, 0, strpos($file, '.'));
}
}
if(in_array($_GET['page'], $pages)){
include($viewPath . $_GET['page'] . '.php');
} else{
include($basePath . '404.php');
}
我正在使用此htaccess文件将我的网址从/base/index.php?page=somepage
重写为/base/somepage
(某些网页是我的模板文件夹中的.php
文件)
RewriteEngine On
RewriteBase /base/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?page=$1 [L,QSA]
使用1参数它可以正常工作但我的问题是我不知道如何重写第二个参数/base/profile?user=username
(没有htaccess文件,这将看起来像/base/index.php?page=profile?user=username
)我希望它看起来像/base/profile/username
。
我希望这个问题是可以理解的:-s
答案 0 :(得分:1)
路由是一个真正的问题,我不能在一条评论中详尽无遗,但我会努力做到最好。请原谅我的大学英语,如果你不明白,请告诉我。我还有很多需要学习的东西,所以我会尝试通过我做的东西来解释,但它可能是完全可以改进的。
今天关于路由和解释请求的PHP标准建议书应该实现PSR7。
我个人通过我正在构建的MVC框架中的FrontController Design Pattern使用它来理解这些概念。我的文件夹组织如下:
公开:
我在哪里启动我的Web服务器,在那里你可以找到JavaScript / CSS。有一个index.php只包含
require_once( '../的index.php');
App: 哪里有路由器,主要是所有通用代码
Src: 哪里有应用程序的特定代码。这意味着现在的控制器和实体。
供应商: 诸如GuzzleHTTP之类的Composer依赖项在实际请求和代码之间有一个类。
这是我的root的index.php中的代码:
<?php
require_once 'vendor/autoload.php';
use Namespace\FrontController;
use \GuzzleHttp\Psr7\ServerRequest;
use function Http\Response\send;
$front_ctrl = new FrontController(ServerRequest::fromGlobals());
send($front_ctrl->getResponse());
它的主要观点是我在实现PSR7的类的实例中解释请求。
在我的FrontController中,我的请求通过一些方法(例如删除尾部斜杠),最终在路由器类中发送进行处理。
我的Router类的purpouse是检查数组中是否存在URI,我在json文件中以这种格式存储了所有路由:
{
"/": [
"AppController",
"indexAction",
["GET", "POST"]
],...
}
这是我使用正则表达式匹配URI内的变量(例如/ article /:id)的地方 此类可以恢复为“我的应用程序中是否存在此URI?”。
此时,我实例化一个新的Route类,其中所有数组都作为参数。从这里开始,我必须回答诸如“它是否附加到控制器中的方法?”,“处理它的方法是否被处理?”之类的问题。 ......
总而言之,此时,我有一个代表请求的类实例,另一个代表所有我的路由的实例。我正面对它们以获得 ONE 路线,我将通过类路线的实例进行操纵。
如果它通过了所有这些测试,那么我可以实例化正确的控制器,其中将有应用程序的特定逻辑部分,需要一些操作来获取数据,我将在我的视图中发送以生成HTML输出我将一直发送回我的函数send,以便在您要求特定URI时显示输出。
这个长答案的要点是向您展示几乎完全独立于服务器的东西。如果您的应用程序变得更大并且必须处理更具体的路由规则,这也很有用。它会强制您分离应用程序的所有包:Controller不是模型也不是路由器......
尝试找到一些很好的教程来学习PHP中的面向对象编程,这样可以避免轻松的安全问题,并在开发应用程序时让您更加舒适:)
希望这是可以理解和有帮助的