如何使用“withANYTHING”方式将变量传递给Laravel中的会话?

时间:2015-09-29 07:27:18

标签: php laravel

在Laravel,我知道

return Redirect::back()->with(['Foo'=>'Bar']);

相当于

return Redirect::back()->withFoo('Bar');

但......它是如何运作的?我的意思是,动态创建一个新函数withFoo来传递一个变量?在Laravel代码中定义了哪种行为?我在哪里查看?

1 个答案:

答案 0 :(得分:1)

以下是它的实施方式(source):

public function __call($method, $parameters)
{
    if (Str::startsWith($method, 'with')) {
        return $this->with(Str::snake(substr($method, 4)), $parameters[0]);
    }
    throw new BadMethodCallException("Method [$method] does not exist on Redirect.");
}

请记住,当尝试调用无法访问的方法时,会触发魔术方法__call。第一个参数是方法的名称,后跟传递的参数。在这种特殊情况下,触发RedirectResponse->with(),设置闪存数据:

public function with($key, $value = null)
{
    $key = is_array($key) ? $key : [$key => $value];
    foreach ($key as $k => $v) {
        $this->session->flash($k, $v);
    }
    return $this;
}