2011-03-28 113 views
2

我正在创建一个MVC框架,它将“action”参数后面的任何url参数传递给请求的动作,通过动作的方法参数。有没有一种方法可以找出定义的方法在该方法外有多少参数? (PHP)

所以如果网址是:

host/controller_name/action_name/param1/param2 

发生下述情况(简化当然):

$requested_controller = new controller_name(); 
call_user_func_array(array($requested_controller, action_name), array(param1, param2); 

的问题是在错误报告。如果请求的URL数量错误(动作需要两个参数,但url只包含一个参数,我会收到警告消息,然后破坏)。

由于这是一个程序错误,而不是一个例外,我不能试图/以任何方式捕捉它,我可以吗?有没有办法在尝试运行之前检查操作方法的预期参数数量?或者我应该用完全不同的方式来攻击它?

EDIT(液)

   $action_method_relfection = new ReflectionMethod($requested_controller, $requested_action); 
       if (count($path_variables) < $action_method_relfection->getNumberOfRequiredParameters() || count($path_variables) > $action_method_relfection->getNumberOfParameters()) { 
        // if not, redirect to 404 error 
        self::redirect_to_404(); 
       } 
+0

可能重复的[如何动态检查一个函数的参数数量在PHP](http://stackoverflow.com/questions/346777/how-to-dynamically-check-number-of-arguments-of-a -function-in-php) – GWW 2011-03-28 18:40:28

+0

只有最终的解决方案存在问题,如果开发者没有在url中包含正确的参数数量,他们将不会收到警告。会找到一个方法。 – dqhendricks 2011-03-28 19:16:12

回答

4

我想的是,使用Reflection API,你能找出多少参数的每个方法接受,使用的


另一个解决方案是让你的方法接受只有一个参数:一个数组,可以包含任何可能数量的项目。

这样,你总是传递一个参数,所有的方法总是期望一个参数;并没有警告/错误了。

+0

+1为阵列法 – Alp 2011-03-28 18:43:35

+0

这些都是有意思的想法。第二个让我感到紧张,因为所有参数都会通过数组的数字索引来传递,而不是命名参数。含糊不清会使包含的代码混淆。我将研究第一个想法的可能性。 – dqhendricks 2011-03-28 18:47:37

+0

@dqhendricks您不仅限于数字索引,还可以使用字符串作为键。 – jeroen 2011-03-28 19:00:26

0

尝试一些简单的像

if (!isset($param1) || !isset($param2)) exit; 
+0

可能有数百个控制器类和数百种操作方法。我不能为每个人做这样的检查。 – dqhendricks 2011-03-28 18:44:25

0

虽然你可以使用func_get_args()功能,那种感觉是错误的方式去了解它。

我总是确定我要调用什么函数以及它需要什么(可选...)参数。

+0

此功能仅在该方法内起作用,警告已经发生。 – dqhendricks 2011-03-28 18:43:22

+0

@dqhendricks只有在没有足够的参数的情况下,您才可以使用1.默认值或2.您的函数中没有定义任何参数。 – jeroen 2011-03-28 18:49:11

+0

需要使用默认值的任何公共控制器方法的要求看起来很麻烦,然后需要在每个方法中进行检查,以确保正常处理无效请求。 - 同样,没有定义参数也会导致任何读取包含代码的人感到困惑。 - 我不希望对每种控制器方法的内容提出繁琐的要求。 – dqhendricks 2011-03-28 18:52:57