production.ERROR: метод [getContent] не существует в представлении - PullRequest
2 голосов
/ 20 февраля 2020

Я работаю над проектом, основанным на laravel 5.5. Когда я использую команду php artisan serve, мой сайт не работает на localhost, и я получаю следующее в моем файле error.log.

{"исключение": "[объект] (BadMethodCallException (код: 0):

Метод [getContent] не существует в представлении. At / home / lord / myproject / vendor / laravel / framework / src / Illuminate / View / View. php: 399)

Ниже приведен кодовый сегмент /vendor/laravel/framework/src/Illuminate/View/View.php:399

    /**
     * Dynamically bind parameters to the view.
     *
     * @param  string  $method
     * @param  array   $parameters
     * @return \Illuminate\View\View
     *
     * @throws \BadMethodCallException
     */
    public function __call($method, $parameters)
    {
        if (! Str::startsWith($method, 'with')) {
            throw new BadMethodCallException("Method [$method] does not exist on view.");
        }

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

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Где-то звонит getContent() на виде. Проблема в том, что ... Представления не имеют указанного метода, который существует в классе Response, поскольку он расширяется от Symfony Http-Foundation Response Class , который определяет защищенный $content свойство, представляющее собой строку с содержимым ответа.

Класс View в Laravel имеет метод getContents, но если вы не вызываете getContent в вашем коде бессмысленно искать опечатку.

Поток, предшествующий ошибке:

Где-то метод getContents() вызывается в представлении, напрямую или через Фасад.

Поскольку у вида нет такого метода, метод волхвов c _call обрабатывает его . По состоянию на Laravel 5.5 было:

/**
 * Dynamically bind parameters to the view.
 *
 * @param  string  $method
 * @param  array   $parameters
 * @return \Illuminate\View\View
 *
 * @throws \BadMethodCallException
 */
public function __call($method, $parameters)
{
    if (! Str::startsWith($method, 'with')) {
        throw new BadMethodCallException("Method [$method] does not exist on view.");
    }

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

(в Laravel 6.x он также проверяет макрос с неопределенным вызванным методом)

Этот код означает, что если вы позвоните, например,

return view('userList')->withAvatarList([$avatar1, $avatar2]);
  • Так как этот метод не существует, он переадресует _call как _call('withAvatarList',[ [$avatar1, $avatar2 ] ]);

    • , если метод не начинается с с (например, getAvatarList), который он выбрасывает.
  • , поскольку он действительно начинается с с , тогда он установит параметр в представлении (потому что это контейнер и может содержать произвольные данные)

    • извлечь часть, которая следует после with (withAvatarList становится AvatarList)
    • использовать Str фасад для форматирования его как camelCase, (AvatarList becodes avatarList)
    • Устанавливает параметр avatarList в представлении в качестве аргумента, вызвавшего метод

Итак, в конце концов, вы назвали

 return  view('userlist')->with('avatarList',[...]);

Как было сказано выше, метод, начинающийся с get, будет выбрасывать.

Редактировать * 10 73 *

Моим лучшим предположением была опечатка в вашем коде или маловероятная ошибка в кеше. Вы сказали, что это из-за режима обслуживания. Однако php artisan down не вызывает ошибку. Он возвращает заголовок 503 и простое сообщение.

Я считаю, что режим обслуживания перекрывается с другим обстоятельством.

0 голосов
/ 27 февраля 2020

Я случайно включил режим обслуживания для моего проекта, и это было причиной ошибки ..

...