Ошибка Laravel: метод Illuminate \ View \ View :: __ toString () не должен генерировать исключение

Вы видели эту прекрасную ошибку при работе в Laravel?

Method Illuminate\View\View::__toString() must not throw an exception

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

Просмотрите ответы и ситуации ниже. :)


person cbloss793    schedule 23.10.2014    source источник
comment
Был ли это когда-нибудь вопрос?   -  person rmobis    schedule 23.10.2014
comment
@Raphael_ Нет, прости! Я просто хотел помочь людям, если они столкнулись с той же проблемой, что и я, и собирались вырвать себе волосы. :)   -  person cbloss793    schedule 24.10.2014
comment
Спасибо за помощь. Я искал информацию об этом, и в конце концов Google нашел меня здесь;)   -  person MaximeBernard    schedule 25.11.2014
comment
@MaximeBernard Рад, что кому-то помог! Удалось ли вам это получить?   -  person cbloss793    schedule 26.11.2014
comment
один вверх! это сэкономило мне время и дало мне некоторые рекомендации   -  person pythonian29033    schedule 15.12.2014
comment
Спасибо @ pythonian29033 !! Я рада, что это вам помогло!   -  person cbloss793    schedule 15.12.2014


Ответы (5)


Есть очень простое решение: не преобразовывать объект View в строку.

Нельзя: echo View::make('..'); или echo view('..');

Do: echo View::make('..')->render(); or echo view('..')->render();

Для версии PHP ‹7.4. При преобразовании представления он автоматически использует метод __toString(), который не может вызвать исключение. Если вы вызываете render() вручную, исключения обрабатываются нормально. Это тот случай, если в представлении есть ошибка - laravel выдает исключение.

Это исправлено в PHP> = 7.4, вы не должны сталкиваться с этой проблемой: https://wiki.php.net/rfc/tostring_exceptions.

Для версии PHP ‹7.4: На самом деле это ограничение PHP, а не Laravel. Подробнее об этой «функции» читайте здесь: https://bugs.php.net/bug.php?id=53648

person Mārtiņš Briedis    schedule 24.03.2015
comment
Аааа. Хороший совет! :) Документация laravel никогда не касалась этого. - person cbloss793; 25.03.2015
comment
это очень полезно! - person 尤川豪; 16.06.2016
comment
У меня все еще та же ошибка. В настоящее время я использую эхо-просмотр ('..'); но при использовании echo view ('..') - ›render (); ничего не произошло. - person kennysong; 27.07.2016
comment
@KennyUIowa, возможно, вы визуализируете представление в представлении. Все под-представления необходимо вызывать вручную с помощью render (). - person Mārtiņš Briedis; 27.07.2016
comment
Теперь это работает. Однако есть переменные (которые были в моем частичном представлении), которые когда-то распознавались при выполнении обычного @include, теперь не распознаются. Я использую ваш метод просмотра эха в специальной директиве. - person kennysong; 28.07.2016
comment
Хотя это может быть ограничение php, это дизайн laravel. Им следовало бы более четко упомянуть часть - ›render (). Это беспокоило меня годами. Наконец-то нашли решение здесь сегодня, спасибо! - person Dustin Graham; 26.01.2017
comment
Могу я выйти за тебя замуж? - person Francisco Ochoa; 23.06.2020
comment
@FranciscoOchoa, прости, приятель, уже женат, но почему бы и нет? - person Mārtiņš Briedis; 23.06.2020

Ситуация 1. Попытка распечатать значение в массиве.

Ответ 1: Попробуйте распечатать массив. Вы уверены, что это массив? Я получил эту ошибку, когда это был объект, а не массив. Попробуйте выполнить print_r и посмотрите, что у вас получится.

Ситуация 2: у вас есть такой связанный массив:

Array
    (
        [post_id] => 65
        [post_text] => Multiple Images!
        [created_at] => 2014-10-23 09:16:46
        [updated_on] => 
        [post_category] => stdClass Object
            (
                [category_label] => Help Wanted
                [category_code] => help_wanted
            )

        [employee_full_name] => Sam Jones
        [employee_pic] => /images/employee-image-placeholder.png
        [employee_email] => [email protected]
        [post_images] => Array
            (
                [0] => stdClass Object
                    (
                        [image_path] => 9452photo_2.JPG
                    )

                [1] => stdClass Object
                    (
                        [image_path] => 8031photo_3.JPG
                    )

            )

    )

Когда вы пытаетесь получить доступ к массиву post_images непосредственно в представлении, возникает ошибка. Нет. Иметь значение. Какие. Ты. Делай.

Ответ 2: Отметьте все места, куда вы вызываете Просмотр. Здесь произошло то, что я пытался получить доступ к тому же представлению где-то еще в области, где я не давал массив post_images. Потребовалось НАВСЕГДА, чтобы понять.

Надеюсь, это поможет кому-то другому. :) Я просто знаю, что повторяющаяся ошибка мне нигде не помогла.

person cbloss793    schedule 23.10.2014
comment
Что это за массив? - person MaximeBernard; 25.11.2014
comment
@MaximeBernard, это был просто пример. Я много раз получал эту ошибку, чувствуя, что опубликовал это. Каждый раз это происходило из-за того, что я пытался вызвать значение в представлении, но не устанавливал его в контроллере каждый раз, когда вызывал представление. Какая досадная ошибка! - person cbloss793; 26.11.2014
comment
Большой!! Рад слышать! :) - person cbloss793; 26.11.2014
comment
Я получаю как бы вторую ситуацию: я могу получить доступ к элементу без отношений hasMany, но не к элементам с отношением hasMany, например, я не могу повторить их даже, если я не пытаюсь это сработать, я ctrl F обыскал весь мой проект, но я пытаюсь сделать это представление только в одном месте. Это дает ошибку, если я пытаюсь повторить эти элементы. - person Jahanzeb Khan; 22.12.2014
comment
@JahanzebKhan, ты пытаешься echo или print_r? Оба очень разные. - person cbloss793; 22.12.2014
comment
echo, я вижу, что вы не должны отображать массив, но еще одна проблема, с которой я все еще сталкиваюсь, заключается в том, что если мне нужно представление в представлении, а затем попытка повторить это представление вызывает эту ошибку, как вы выводите вид в представлении, я пробовал искать, но не мог найти, как это сделать. - person Jahanzeb Khan; 22.12.2014
comment
@JahanzebKhan, я видел представление внутри представления, выполненное несколькими разными способами. Вот один из способов: stackoverflow.com/questions/17227969/ Не забудьте отправить данные, которые требуются для дополнительного представления. Данные из родительского представления НЕ переходят в дочернее представление. - person cbloss793; 22.12.2014
comment
Большое спасибо! Я знаю, что это, наверное, просто поискать, но я просто нигде не мог найти! - person Jahanzeb Khan; 23.12.2014
comment
@JahanzebKhan добро пожаловать! Иногда бывает трудно найти нужную информацию, если не удается подобрать правильные слова. По крайней мере, это то, что я испытал. - person cbloss793; 23.12.2014

Я столкнулся с такой ошибкой, когда объект в моем случае $expression = new Expression(); совпадает с параметром переменной submitExpression($intent, $bot_id, **$expression**){. Для получения дополнительных сведений см. Приведенный ниже код.

private function submitExpression($b_id, $expression){
   $expression = new Expression();
   $expression->b_id = $b_id;
   $expression->expression = $expression;
   $expression->save();

}

поэтому я изменил приведенный выше код на что-то вроде

private function submitExpression($b_id, $statement){      
   $expression = new Expression();
   $expression->b_id = $b_id;
   $expression->expression = $statement;
   $expression->save(); 
}

и все работало нормально, надеюсь, вы найдете это полезным.

person Solar    schedule 05.02.2019

Моя проблема заключалась в том, чтобы выяснить, где именно View::__toString() вызывается в моем коде, чтобы я мог исправить это с помощью render() (как предлагают другие ответы).

Чтобы найти его, временно отредактируйте vendor/laravel/framework/src/Illuminate/View/View.php, добавив протоколирование текущей трассировки стека:

public function __toString()
{
    // Next line added temporarily to debug.
    logger("This causes the '__toString() must not throw an exception' problem: " 
        . (new \Exception())->getTraceAsString());
    return $this->render();
}
person Jan Żankowski    schedule 04.12.2020

аналогичная ошибка:

FatalErrorException в строке 0 FooController.php: метод App \ Models \ Foo :: __ toString () не должен вызывать исключение

и это было просто плохое задание: $foo.= new Foo;

вместо: $foo = new Foo;

person alexanderesmar    schedule 25.02.2018
comment
Совершенно верно! Хороший звонок! - person cbloss793; 26.02.2018
comment
Это не совсем объяснение. Здесь происходит конкатенация класса с переменной, которая запускает вызов метода __toString() в экземпляре Foo. Если вызов __toString() вызывает исключение где-то внутри, вы увидите это сообщение. - person Mārtiņš Briedis; 23.07.2018