【问题标题】:loading method based on URL [duplicate]基于 URL 的加载方法 [重复]
【发布时间】:2012-10-18 03:03:26
【问题描述】:

我正在尝试构建一个基于 mvc 的小型应用程序。

如何根据查询字符串调用类中的方法?

例如,$_GET 查询字符串被设置为 load_master_form

http://www.domain.com/settings/load_master_form

为了调用设置类中的方法,我正在做:

function __construct(){
    $this->{$_GET['method']}();
}

但显然这不起作用 - 只是无法加载这样的方法。那么如何实现呢?

【问题讨论】:

  • 你需要创建一个路由机制.. 我猜this 可能会有所帮助
  • 你确定你甚至想做这样的事情吗?如何阻止恶意用户做example.com?method=blow_up_the_universe
  • @Marc B,该类只加载公共数据,如果该方法不存在则进入404页面。
  • 你知道Htaccess重写规则吗?还有一个问题,设置是不是文件夹。?

标签: php model-view-controller class methods


【解决方案1】:

我认为这可以正常工作,只要您为 $_GET['method'] 创建了方法,并且您使用的是 URI 路由(.htaccess 或其他)

一般我倾向于在 URI 中调用方法名 -

// domain.com/class_name/method_name/params

class class_name{
    function __construct(){
        ...
    }
    function method_name(){
        ...
    }
// etc.
}

【讨论】:

  • 这是我现在正在尝试做的,但我的问题是如何从 method_name uri 加载方法?
  • 为什么您将其标记为已接受的答案?
  • 因为它帮我弄清楚了...
【解决方案2】:

我会像这样使用反射:

public static function doUserMethod($methodName)
{
    $reflectionMethod = new ReflectionMethod('YourUserMethodsClass', $methodName);
    return $reflectionMethod->invokeArgs(new YourUserMethodsClass(), array(/* Method Arguments Here */));
}

然后可以称为:

YourClass::doUserMethod($_GET['method']);

这样做的好处是您可以将用户限制为仅使用您指定的特定类中的方法(即我的示例中的YourUserMethodsClass)。显然,如果您的方法需要参数(与您给出的示例不同),您将需要一些特殊的额外处理。

【讨论】:

  • 反射比简单的method_exists() 慢几个数量级,静态调用意味着您决定求助于过程编程。
【解决方案3】:

首先,您必须创建 .htaccess 文件,将所有请求重定向到单个文件(通常是 index.php)。然后将用户输入的字符串作为 GET 变量传递给 php。

如何创建.htaccess文件见here

然后您必须决定 MVC 的结构。假设您希望 url(http://www.someting.com/first/second/third) 中的每个第三个参数都是一个方法。然后你会做这样的事情..

// Variables
$args = explode('/',$_GET['method']);

// Get method
$method = rtrim($args[1]);

这只是一个糟糕的解决方案..

【讨论】:

  • 即使在最简单的情况下,这也会假设$_GET['method] 中总是至少有两个斜杠。如果您不知道字符串中分隔符的数量,最好在末尾添加一些额外的分隔符:explode( '/', $_GET['method'] . '//' ); 至少这样可以避免不必要的警告.. 如果不能真正解决底层问题 @987654325 @
  • mvc 框架中通常有..
  • http://who.cares/ .. 此链接会为您生成 1 个或 0 个斜杠(取决于 URL 重写详细信息),当您访问第二个数组元素时,这可能会导致警告。
  • 实际上我在代码中犯了一个错误,你会到达数组 [1] 而不是数组 [2]。您可以检查 array[0] 是否存在,如果为 true 则调用一个类,如果 array[1] 则调用该类中的方法,依此类推。正如我所说,mvc url 的通常模式是 www.something.com/class/method/parameters
  • 是的..我相应地更新了评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
相关资源
最近更新 更多