В чем разница между withTest1 ($ a) и compact ($ a) в Laravel? - PullRequest
3 голосов
/ 24 января 2020

Я практикуюсь в Laravel, и я нашел полезный метод "-> withVariable ($ example)", где вы можете использовать переменную как имя переменной $ в файле блейда.

Я хотел бы спросить, есть ли разница между методом A и методом B?


МЕТОД A

в контроллере:

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

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

в поле зрения:

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

МЕТОД B

в контроллере:

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

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

в поле зрения:

$a // test a
$b // test b
$c // test c

1 Ответ

2 голосов
/ 24 января 2020

Очевидно, существует некоторый неприятный код, который допускает такое поведение, см. 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'));

К сожалению, существует целый ряд возможностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...