Есть ли способ выяснить, сколько параметров ожидает определенный метод за пределами метода? (PHP) - PullRequest
2 голосов
/ 28 марта 2011

Я работаю над созданием инфраструктуры MVC, которая передает любые параметры URL после параметра "action" запрошенному действию через параметры метода действия.

, поэтому, если URL-адрес:

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-адрес содержит только один параметр, я получаю предупреждающее сообщение, а затем хаос).

Поскольку это процедурная ошибка, а не исключение, я не могу попытаться / поймать ее, не так ли? Есть ли способ проверить количество ожидаемых параметров для метода действия, прежде чем пытаться его запустить? Или я должен атаковать это совершенно по-другому?

РЕДАКТИРОВАТЬ (РЕШЕНИЕ)

                $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();
                }

Ответы [ 3 ]

4 голосов
/ 28 марта 2011

Я полагаю, что, используя Reflection API , вы можете узнать, сколько параметров принимает каждый метод, используя некоторую комбинацию


Другим решением было бы, что ваши методы принимают только один - и всегда один- параметр: массив, который может содержать любое возможное количество элементов.

Таким образом, вы всегда передаете один параметр, все методы всегда ожидают один параметр;и больше нет предупреждений / ошибок.

0 голосов
/ 28 марта 2011

Несмотря на то, что вы можете использовать функцию func_get_args(), это своего рода неправильное решение.

Я бы всегда проверял, какую функцию я вызываю и какие (необязательные ...) аргументы ей нужны.

0 голосов
/ 28 марта 2011

Попробуйте что-нибудь простое, как

if (!isset($param1) || !isset($param2)) exit;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...