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

问题描述 投票:1回答:1

我正在用PHP实现Klein路由器,我有一点问题...我想从我的控制器调用一个特殊的函数,给它(或不)$ 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); });

这个工作正在运作,但我觉得我错过了一些东西...我想分解这个,有什么解决方案吗?谢谢

php function controller router klein-mvc
1个回答
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']);

使它更紧凑。

© www.soinside.com 2019 - 2024. All rights reserved.