如何“;请求->;getBody";适用于苗条身材


how "request->getBody" works in slim

如果我做一篇文章,我可以通过$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()方法测试是否可以调用具有关键字$keydata属性数组中的值,如果为true,则执行该操作。

所以$this->data[$this->normalizeKey($key)]($this)调用了一个以$this为参数的方法,然后Set->get()返回该方法的返回值。

闭包也经常被称为"匿名函数",这是PHP 5.3的一个新特性。从PHP 5.4开始,就可以使用数组作为变量来调用函数。

它允许您将函数/方法作为值传递,这可以说是函数编程中的独特特性。

函数singleton在初始化之前被调用。

它正在设置一个函数的所有$key。

所以,$this->data[$this->normalizeKey($key)]($this)就是这个函数!