PHP klein路由器调用特殊控制器功能

时间:2017-12-21 13:50:04

标签: php function controller router klein-mvc

我在php中实现了Klein路由器,我有一点问题...... 我想从我的控制器调用一个特殊的函数,给它(或不)$ request变量,如下所示:

$klein->respond('GET', '/[i:id]?', HomeController::view($request));

但是我有错误:未捕获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 个答案:

答案 0 :(得分:0)

试试这个:

$klein->respond('GET', '/[i:id]?', array('HomeController','view'));

在Klein的例子中,就像在你的第三个例子中一样,我们传递一个闭包,一个匿名函数,一个lambda,或者你想要的其他任何东西。无论如何,因为我们要将其声明为内联,我们必须指定参数。

另一方面,HomeController::view的参数在其自己的声明中指定。如果您将参数内联,就像在第一个和第二个示例中一样,那么您实际上是在该行上调用view函数。你想把这个函数传递给$klein,稍后再调用,这就是我上面的例子应该做的。

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

使它更紧凑。