如果我发帖,我可以通过$payload = json_decode($app->request->getBody());
但我无法理解request->getBody
在苗条中是如何运作的。
首先,这是一种神奇的方法:
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,而$值是一个闭包?
为什么只执行static $object
会使$对象从单位化变为Slim \ Http \ Request类型之一?
答案 0 :(得分:0)
免责声明:我不熟悉Slim。我只是按照你发布的内容去做。
好吧,Set->get()
方法测试,如果可以调用data
属性数组中带有键$key
的值,然后执行,如果为真。
因此$this->data[$this->normalizeKey($key)]($this)
正在调用以$this
为参数的方法,然后Set->get()
返回该方法的返回值。
闭包通常也称为“anonymous function”,这是PHP 5.3中的一个新功能。自PHP 5.4以来,可以使用数组variable to call a function。
它允许您将函数/方法作为值传递,这可以说是functional programming中的 区别特征。
答案 1 :(得分:0)
在初始化之前调用函数singleton。
将所有$键设置为函数。
所以,$this->data[$this->normalizeKey($key)]($this)
就是那个功能!