我厌倦了根据页面和所有内容编写脚本。我不想做旧事。我想基于url学习OOP。我知道如何使用.htacces进行网址屏蔽和重写规则。但问题是,当我将所有查询转发到PHP页面时,我不得不使用switch case语句来包含文件。就像查询是p = profile一样,我需要手动或通过函数包含profile.php文件。但我不想做这类事情。我想学习专业的PHP,所以我可以创建像wordpress和elgg等所有的webapps。我已经尝试过找到有关它的在线教程,但它对我不起作用。
我希望至少有一个人会帮助我纠正方法。
答案 0 :(得分:4)
有很多方法可以做到这一点。但是,它的要点是,如何命名控制器及其方法使用约定。使用URL重写将所有请求映射到单个请求调度程序,然后使用该类中的逻辑加载适当的资源(如您所述)。但是不要使用巨型switch
,而应该执行以下操作:
dispatcher.php?q=blog/hello-world
q
并考虑:
a)课程controllers/Blog.php
是否存在?如果这样实例化
b)是否使用helloWorld
方法的类博客?如果是这样,请将其称为这是一个脑死亡的例子,但也许它会让你开始。
我的建议:不要重新发明轮子。使用像Laravel或Yii这样的质量框架或 _ (在此插入最喜欢的框架)。这将为您节省无法估量的时间。但是,如果您想要或必须从头开始编写,请考虑下载此类框架并通过示例进行学习。
答案 1 :(得分:2)
通常,网址中的参数用于调用相应的class/function
。假设我们有这些网址:
- example.com/index.php?控制器 = foo
- example.com/index.php?控制器 = foo & 功能 = 编辑
- example.com/index.php?控制器 = <强>巴强>
在index.php
,您可以开始使用以下内容:
$controller = $_GET["controller"];
include("controllers/{$controller}");
$theClass = new $controller();
某些Web应用程序使用“默认功能”,该功能在URL中未指定功能时触发。例如,index
函数:
$function = $_GET["function"];
if (empty($function))
$function = "index"; // the default function to be called
$theClass->$function();
Foo类看起来像这样:
class Foo{
function index(){
echo "hello index";
}
function edit(){
echo "editing foo";
}
}
hello index
editting foo
注意:强>
您可以使用$_SERVER['QUERY_STRING']
代替$_GET
为网址提供更“友好”的信息。
答案 2 :(得分:1)
怎么样:
<?php
if(!isset($_GET['page'])){$_GET['page'] = 'index';}
$whiteList = array('index', 'page1', 'page2');
$controller = in_array($_GET['page'], $whiteList) ? $_GET['page'] : 'index';
$controller = new $controller();
$controller::indexAction();
?>
编辑:添加了对控制器的调用。