如果我做一篇文章,我可以通过$payload = json_decode($app->request->getBody());
获得内容
但我无法理解request->getBody
在slim中是如何工作的。
首先,有一个神奇的方法:
public function __get($name)
{
return $this->container->get($name);
}
这将返回一个Slim''Http''Request对象。现在还可以。
$this->container
是Slim''Helper''Set,这是get函数:
public function get($key, $default = null)
{
if ($this->has($key)) {
$isInvokable = is_object($this->data[$this->normalizeKey($key)]) && method_exists($this->data[$this->normalizeKey($key)], '__invoke');
return $isInvokable ? $this->data[$this->normalizeKey($key)]($this) : $this->data[$this->normalizeKey($key)];
}
return $default;
}
$this->data[$this->normalizeKey($key)]
与$this->data['request']
相同,属于"闭包"类型(不一定能理解)。
$isInvokable
为真,因此称为:
$this->data[$this->normalizeKey($key)]($this)
这条线在干什么?为什么($this)
(Slim''Helper''Set)在最后?
特别是,为什么下一个要调用的函数是:
public function singleton($key, $value)
{
$this->set($key, function ($c) use ($value) {
static $object;
if (null === $object) {
$object = $value($c);
}
return $object;
});
}
为什么选择singleton($key, $value)
?它从未被调用过!$key未在函数开始时定义。是什么让$c成为Slim''Helper''Set,$value成为闭包?
为什么只执行static $object
会使$对象从单元化变成Slim''Http''Request类型的对象?
免责声明:我不熟悉Slim。我只是按照你发的去做。
好吧,Set->get()
方法测试是否可以调用具有关键字$key
的data
属性数组中的值,如果为true,则执行该操作。
所以$this->data[$this->normalizeKey($key)]($this)
调用了一个以$this
为参数的方法,然后Set->get()
返回该方法的返回值。
闭包也经常被称为"匿名函数",这是PHP 5.3的一个新特性。从PHP 5.4开始,就可以使用数组作为变量来调用函数。
它允许您将函数/方法作为值传递,这可以说是函数编程中的独特特性。
函数singleton在初始化之前被调用。
它正在设置一个函数的所有$key。
所以,$this->data[$this->normalizeKey($key)]($this)
就是这个函数!