Php 在Laravel中,withTest1($a)和compact($a)之间有什么区别?

Php 在Laravel中,withTest1($a)和compact($a)之间有什么区别?,php,laravel,Php,Laravel,我在Laravel中练习,发现了一个有用的方法“->withVariable($example)”,您可以在blade文件中将变量用作$Variable name 我想问一下方法A和方法B之间是否有任何区别? 方法A 在控制器中: $a = 'test a'; $b = 'test b'; $c = 'test c'; return view('welcome')->withTest1($a)->withTest2($b)->withTest3($c); $a = 'te

我在Laravel中练习,发现了一个有用的方法“->withVariable($example)”,您可以在blade文件中将变量用作$Variable name

我想问一下方法A和方法B之间是否有任何区别?


方法A 在控制器中:

$a = 'test a';
$b = 'test b';
$c = 'test c';

return view('welcome')->withTest1($a)->withTest2($b)->withTest3($c);
$a = 'test a';
$b = 'test b';
$c = 'test c';

return view('welcome', compact('a', 'b', 'c'));
鉴于:

$test1 // test a
$test2 // test b
$test3 // test c
$a // test a
$b // test b
$c // test c

方法B 在控制器中:

$a = 'test a';
$b = 'test b';
$c = 'test c';

return view('welcome')->withTest1($a)->withTest2($b)->withTest3($c);
$a = 'test a';
$b = 'test b';
$c = 'test c';

return view('welcome', compact('a', 'b', 'c'));
鉴于:

$test1 // test a
$test2 // test b
$test3 // test c
$a // test a
$b // test b
$c // test c

显然存在允许这种行为的一些讨厌的代码,请参见
illumb\View\View

/**
*将参数动态绑定到视图。
*
*@param string$方法
*@param数组$parameters
*@return\light\View\View
*
*@throws\BadMethodCallException
*/
公共函数调用($method,$parameters)
{
if(static::hasMacro($method)){
返回$this->macroCall($method,$parameters);
}
如果(!Str::startsWith($method,'with')){
抛出新的BadMethodCallException(sprintf(
“方法%s::%s不存在。”,静态::类,$Method
));
}
返回$this->with(Str::camel(substr($method,4)),$parameters[0]);
}
因此,这个
\u调用
方法捕获对视图实例的所有方法调用。 调用
view()->withTest('abc')
将导致
$method='withTest'
并最终级联到最后一行,该行只调用
$this->with('test','abc')

因此,最终结果没有差别。
withTest
链看起来很糟糕

我认为这些神奇的方法应该避免;可以像以前一样使用
compact()
表单,也可以简单地使用:

view('myview'[
‘foo’=>123,
'bar'=>'abc'
]);
//或
视图('myview')->带有([
‘foo’=>123,
'bar'=>'abc'
]);
//或
$foo=123;
$bar='abc';
视图('myview',compact('foo','bar'));
//或
视图('myview')->带有(紧凑型('foo','bar');

遗憾的是,还有很多可能性。

非常感谢。我保留“这些神奇的方法应该避免”这句话:)