получить количество контроллеров args от маршрутизатора? - PullRequest
1 голос
/ 21 января 2011

Хорошо, я изучаю, как сделать свою собственную систему MVC, пока я создал такие вещи, как маршрутизатор и контроллер.

пример У меня есть класс профиля контроллера и URL-адрес 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. но как насчет параметров в вызываемом классе? как мы можем подсчитать параметры в вызываемом классе с помощью call_user_func_array ?

Спасибо, что заглянули в

Адам Рамадан

Ответы [ 3 ]

1 голос
/ 21 января 2011

Вы можете использовать отражение:

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

Можно сделать строже, проверив, не слишком ли много параметров.

1 голос
/ 21 января 2011

Из того, что я знаю, нет способа получить количество параметров для метода без использования reflections .Тем не менее, это довольно просто и будет выглядеть примерно так:

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

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

даст

index expects 2 parameter

Обратите внимание, что отражение всегда сопряжено со стоимостью.Тем не менее, это не должно быть заметно для производительности.

0 голосов
/ 21 января 2011

подсчет параметров в вызываемом классе по call_user_func_array

На самом деле довольно просто.Вы можете определить количество параметров, извлекая их в массив, используя 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...