Я внедряю роутер Klein в php, и у меня есть небольшая проблема …
Я хотел бы вызвать специальную функцию из моего контроллера, передав ей (или нет) переменную $ request следующим образом:
$klein->respond('GET', '/[i:id]?', HomeController::view($request));
Но у меня есть ошибка: Uncaught InvalidArgumentException: ожидается вызов. Получил невостребованный NULL
Поэтому я изменил свой код на:
$klein->respond('GET', '/[i:id]?', new HomeController::view($request));
и теперь ошибка это: синтаксическая ошибка, неожиданное «представление» (T_STRING), ожидаемая переменная (T_VARIABLE) или «$»
Наконец, я нашел решение, пишущее мой код следующим образом:
$klein->respond('GET', '/[i:id]?', function($request){ HomeController::view($request); });
Этот работает, но я чувствую, что что-то упустил … Я хотел бы проанализировать это, есть ли решение?
Спасибо вам
Попробуй это:
$klein->respond('GET', '/[i:id]?', array('HomeController','view'));
В примерах Klein, как и в вашем третьем примере, мы передаем замыкание, или анонимную функцию, или лямбду, или как угодно еще, чтобы вы вызывали это. В любом случае, потому что мы объявляем это встроенным, мы должны указать параметры.
С другой стороны, HomeController::view
аргументы указаны в собственном объявлении. Если вы поместите аргументы в строку, как в первом и втором примерах, вы на самом деле view
функция на этой линии. Вы хотите передать функцию $klein
, который будет вызван позже, что и должен делать мой пример выше.
Клейн respond
Функция принимает то, что PHP называет вызываемым. Оказывается, есть миллион способов указать вызываемое в PHP:
http://php.net/manual/en/language.types.callable.php
Я думал, что ты мог сделать $klein->respond('GET', '/[i:id]?', HomeController::view);
но это не кажется правильным. Работает на Python, но не на PHP. Ну что ж.
Если вы используете PHP 5.4 или новее, вы можете использовать синтаксис короткого массива:
$klein->respond('GET', '/[i:id]?', ['HomeController','view']);
сделать его немного более компактным.
Других решений пока нет …