这是我第一次创建一个frontController,我遇到了一些小问题。
首先让我给您一个印象:当我在浏览器中打开http://mysite.com/test时,服务器将使用GET参数$controller (test)调用index.php。这是由一个.htaccess完成的。在index.php中,将创建类$controller的一个实例。为此,我使用了PHP的__autoload函数。代码看起来如下:
$controller = $_GET["controller"];
function __autoload($controller)
{
include("controllers/$controller.php");
if(!class_exists($controller, false))
{
eval
('
class '. $controller . '
{
public function __construct()
{
include("404.html");
exit();
}
}
');
}
}
$application = new $controller;当您查看我提供的代码时,您可能已经注意到了其中的eval()。我使用它来避免$controller类不存在时的致命错误,并显示一个404而不是它。
和这里开始的乐趣:当有人进入一个url时,就像
http://mysite.com/ImATroll!:D
将会有
解析错误:语法错误,意外的'!‘
还有..。
致命错误:未找到类'ImATroll!:D‘
,所以问题是:,我怎么能抓到这个?如何转义$controller变量,使其只包含类名所允许的字符?
发布于 2012-06-18 09:32:32
实际上,您可以从自动加载函数中抛出一个异常(p.s.:使用寄存器 )。
此异常是可捕捉的,因此您可以提供“默认”功能。
到目前为止,这是一种更好的方法,但是如果您坚持要创建这个假控制器,则应该使用class_alias。
发布于 2012-06-18 09:22:58
我只需要简单地将放到中-- eval部分,并在该部分直接重定向到404。
或者构建一个(非动态的) 404- ContentNotFoundController (如果需要的话),只需使用/生成(当类名不存在时)。
发布于 2012-06-18 09:23:43
为什么不在调用new $controller;之前尝试new $controller; (class_exists将调用autoload函数),如果为false,则包含(‘404.html’);
function __autoload($classname){
$file = "controllers/$classname.php";
if(is_file($file))
include_once($file);
}..。但是要注意安全问题--例如传入?控制器=../htpasswd。您应该通过删除所有非字母数字字符类$classname = preg_replace('/[^A-Za-z0-9]/', '', $classname);来净化类名。
https://stackoverflow.com/questions/11079952
复制相似问题