从路由器获取计数控制器args?

时间:2011-01-21 09:27:59

标签: php model-view-controller dispatcher router

确定我正在学习如何制作我自己的自定义mvc系统,到目前为止我已经创建了路由器和控制器之类的东西。

示例我有一个控制器配置文件类和一个网址www.helloworld.com/args1/args2/args3

class Profiles
{
    function index($args1,$args2)
    {
        echo var_dump($args1,$args2);
    }
}

继承人是我的路由器类的一部分,它执行方法和参数

        if (is_callable(array($controller,$method))) {
            call_user_func_array(array($controller, $method), $this->params);
        }

到目前为止没有错误,但不知怎的,我需要提供404.如果$this->params与我在count(params)调用的方法中的call_user_func_array(array($controller, $method), $this->params);不同

好吧我的想法是,如果计数得到的参数与被叫类的计数参数不一样,那么404, 让我说我可以算上我的$ this-> params它给了我一个3.但是被叫类中的params怎么样? 我们如何通过call_user_func_array 计算被调用类中的参数?

感谢您查看

Adam Ramadhan

3 个答案:

答案 0 :(得分:1)

据我所知,没有使用reflection的方法无法获取方法的参数计数。但是,它非常简单,看起来像这样:

$reflector = new ReflectionClass('Profiles');
$method = $reflector->getMethod('index');
$parameters = $method->getParameters();

printf('%s expects %d parameters', $method->name, count($parameters));

将产生

index expects 2 parameter

请注意,反射总是带来成本。但是,这对性能的影响不应该是显而易见的。

答案 1 :(得分:1)

你可以使用反射:

$refclass = new ReflectionClass($controller);
$param_count = $refclass->getMethod($method)->getNumberOfRequiredParameters();
if ($param_count <= count($this->params)) {
    $refclass->invokeArgs($controller, $this->params);
} else {
    // 404
}

通过检查参数是否太多可以更加严格。

答案 2 :(得分:0)

  

通过call_user_func_array

计算被调用类中的params

实际上相当简单。您可以使用func_get_args将参数添加到数组中,然后count来确定参数的数量。例如:

<?php
function foo( ) {
   echo "I have received " . count( func_get_args( ) ) . " parameters.";
}
foo( ); // I have received 0 parameters.
foo( 1, 2, 3, 4, 5 ); // I have received 5 parameters.