1

所以我有一个名为 Engine.php 的库,它的作用基本上是在运行

example.com/controller/method/value

所以例如,如果我有

example.com/category/images

它运行称为“图像”的方法。但我不想为每个类别添加代码。我希望该方法是一个变量(以便稍后我将使其与 db 一起使用)。

如何在不更改引擎的情况下实现这一目标?问题是 - 有些页面根本没有类别。而且我不想重写引擎本身。

我可以在控制器中以某种方式做到这一点吗?例如:

我正在输入名为“类别”的控制器,如果设置了方法,它会在控制器中搜索此方法(“类别”)。

这就是我的 Engine.php 的一部分:

    if (isset($url_output[1])) {
        if (isset($url_output[2])) {
            if (method_exists($controller,$url_output[1])) {
                $controller->{$url_output[1]}($url_output[2]);
            } else {
                $this->error();
            }
        } else {
            if (method_exists($controller,$url_output[1])) {
                $controller->{$url_output[1]}();
            } else {
                $this->error();
            }
        }
      }

所以基本上,如您所见:

$controller->{$url_output[1]}();

$url_output[1] = 控制器中名为 $url_output[0] 的方法的名称。

我想要的是:

public function $category() {
echo $category
}

你知道我的意思?

4

3 回答 3

1

你为什么不做这样的网址

example.com/category/index/images

其中 index 是类别控制器的预定义函数,图像将作为第一个参数传递给 index 函数。

第二种选择,绕过 url 中的索引功能。

if (isset($url_output[1])) {
    if (method_exists($controller,'index')) {
        $controller->index($url_output[1]);
    } else {
        $this->error();
    }
}

class Category
{
    function index($category)
    {

    }
}

像这样使用:example.com/category/images

于 2012-08-08T19:49:45.207 回答
1

您可以尝试使用变量 variable
警告:从安全的角度来看,这是非常危险的,所以如果你这样做,你应该确保你验证你的输入!

if (isset($url_output[1])) {
    if (isset($url_output[2])) {
        if (method_exists($controller,$url_output[1])) {
            $controller->{$url_output[1]}($url_output[2]);
        } else {
            $this->error();
        }
    } else {
        if (array_search($allowed_categories, $url_output[1]) !== FALSE) {
            echo ${$url_output[1]};
        } else {
            $this->error();
        }
    }
  }

基本上,如果$url_output[1]image,则${$url_output[1]}转换为$image,然后输出$image变量的值。该$allowed_categories变量应该是一个包含您要处理的任何类别的数组。这是为了防止恶意用户进入某些会输出敏感变量的类别。

于 2012-08-08T19:51:48.723 回答
1

您需要做的是为您的项目创建一个真正的路由机制。我已经在其他两个答案中介绍了它:thisthis。其中一个我已经把你链接到了一次。

重点是创建正则表达式 (regexp) 对你可以匹配传入的URL。如果您找到匹配的模式,则使用拆分它preg_match()并分配一些默认值,如果 URL 的非强制性部分丢失。

您可以自己制作路由机制,也可以从其他项目(简单复杂)移植它。

此外,您应该将应用程序的路由部分与处理调度到控制器的部分分开。检查控制器中是否有这样的方法或者用户是否被允许访问它,不是路由过程的一部分。如果将它们混合在一起,您将违反SRP

于 2012-08-08T20:11:52.757 回答