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

PHP klein router call special controller function

我正在 php 中实施 Klein 路由器,但我遇到了一个小问题... 我想从我的控制器调用一个特殊的函数,给它(或不)像这样的 $request 变量:

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

但我有错误:未捕获 InvalidArgumentException:需要一个可调用对象。得到一个不可调用的 NULL 所以我将代码更改为:

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

现在的错误是:语法错误,意外的 'view' (T_STRING),需要变量 (T_VARIABLE) 或 '$' 最后我找到了一个像这样编写我的代码的解决方案:

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

这个工作正常,但我觉得我遗漏了一些东西...我想分解这个,有什么解决办法吗? 谢谢你

试试这个:

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

让它更紧凑一些。