PHP Klein Router вызов специальной функции контроллера

Я внедряю роутер 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); });

Этот работает, но я чувствую, что что-то упустил … Я хотел бы проанализировать это, есть ли решение?
Спасибо вам

1

Решение

Попробуй это:

$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']);

сделать его немного более компактным.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]