laravel with()方法如何用于RedirectResponse

时间:2018-04-11 06:40:58

标签: php laravel

真的这个问题让我发疯了。现在我想问一下用于var answer = await DisplayAlert("Exit", "Do you wan't to exit the App?", "Yes", "No"); if (answer) { // User choose Yes } else { // User choose No } 的laravel with()。我经常搜索和研究,但我无法获得成功和满意的满足感。所以这是主要问题。 我们可以RedirectResponse使用with()这样的

RedirectResponse

或者

return view('name')->with(['demo'=>$demo]);

给出上述方法对我来说是可以理解的 问题在这里。我们也可以这样使用。

return view('name')->with('demo',$demo);

因此我无法理解return view('name')->withDemo($demo); 背后的逻辑,因为withDemo()未定义任何where.i在laravel中搜索withDemo()。我发现了一些关于这里的信息

with()

我找到了类似的东西

vendor/laravel/framework/src/Illuminate/Http/RedirectResponse.php

请任何人都可以解释动态定义方法背后的逻辑,如public function __call($method, $parameters) { if (static::hasMacro($method)) { return $this->macroCall($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." ); } 它可能是重复的问题,对不起,但我搜索了很多。我没有找到与此主题相关的内容。

3 个答案:

答案 0 :(得分:1)

RedirectResponse上会出现同样的魔法,但您可能对Illuminate\View\View上的代码感兴趣:

/**
 * Dynamically bind parameters to the view.
 *
 * @param  string  $method
 * @param  array   $parameters
 * @return \Illuminate\View\View
 *
 * @throws \BadMethodCallException
 */
public function __call($method, $parameters)
{
    if (static::hasMacro($method)) {
        return $this->macroCall($method, $parameters);
    }

    if (! Str::startsWith($method, 'with')) {
        throw new BadMethodCallException(sprintf(
            'Method %s::%s does not exist.', static::class, $method
        ));
    }

    return $this->with(Str::camel(substr($method, 4)), $parameters[0]);
}

像@abrar一样指出这是使用PHP的魔术方法。当您调用对象上不存在的方法时,PHP将调用__call()传递方法名称和参数。

你可以在这里看到Laravel将首先检查宏是否存在并且如果存在则使用它。否则,它确认方法名称以with开头,然后将其直接传递给with()方法,就像直接调用它一样。

答案 1 :(得分:1)

每当您尝试调用未定义的方法时,都会调用

__call($method, $parameters)

当您致电withDemo($demo)时,口译员会跳转到__call($method, $parameters)

$method = 'withDemo';
$parameters = [$demo];

'与'在substr函数调用中被剥离并且它会被勒住。

真实的'使用变量名称调用'剥离'看起来像这样:

return $this->with('demo', $parameters[0]); // $parameters[0] -> $demo

答案 2 :(得分:0)

这是将函数和参数一起编写的更简单方法

例如。 with('key1', 'value1')withKey1('value1')

例如。 where('mycolumn', 'value')whereMycolumn('value')