Очевидно, существует некоторый неприятный код, который допускает такое поведение, см. 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]);
}
Так что этот метод __call
захватывает все вызовы метода для экземпляра представления. Вызов view()->withTest('abc')
приведет к $method = 'withTest'
и, в конечном итоге, приведет к каскадному переходу к последней строке, которая просто вызывает $this->with('test', 'abc')
.
Так что в конечном результате нет никакой разницы. Цепочка withTest
выглядит просто отвратительно.
Имхо, этих магов c методов следует избегать; или используйте форму compact()
, как вы уже сделали, или просто используйте:
view('myview', [
'foo' => 123,
'bar' => 'abc'
]);
// or
view('myview')->with([
'foo' => 123,
'bar' => 'abc'
]);
// or
$foo = 123;
$bar = 'abc';
view('myview', compact('foo', 'bar'));
// or
view('myview')->with(compact('foo', 'bar'));
К сожалению, существует целый ряд возможностей.