Мой код не работает вне вспомогательной функции laravel dd()

Ну... я не могу понять, как это могло произойти, но... мой код

$parser->mpml->images()->where('order', $parser->figureCounter)->first()->getUrl()

не работал только за пределами вспомогательной функции dd(). Он производит

Call to a member function getUrl() on null error.

Когда внутри,

dd($parser->mpml->images()->where('order', $parser->figureCounter)->first()->getUrl());

он работает и создает правильную строку URL...? Эта проблема на самом деле возникла неделю назад, она решилась сама собой, даже если я ничего не делаю. Теперь это происходит снова.

У кого есть подобный опыт, поделитесь знаниями?

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


class FigureSubparser extends Subparser {
    public function start($attrs)
    {
        $this->attrs = $attrs;

        try {
            $order = $this->getEngine()->incFigureCounter()->getFigureCounter();
            $url = $this->getEngine()->mpml->images()->where('order', $order)->first()->getUrl();
        } catch (\Throwable $e) {
            dd($e->getMessage());
        }

        return '<img src = "'.$url.'"/>';
    }
}

Выше продукты "Call to a member function getImageUrl() on null"


Однако, когда я прямо вставил часть $url в dd(),

class FigureSubparser extends Subparser
{
    public function start($attrs)
    {
        $this->attrs = $attrs;

        // try {
            $order = $this->getEngine()->incFigureCounter()->getFigureCounter();
        //  $mpmlimage = $this->getEngine()->mpml->images()->where('order', $order)->first()->getUrl();
        // } catch (\Throwable $e) {
        //  dd($e->getMessage());
        // }

        dd($this->getEngine()->mpml->images()->where('order', $order)->first()->getUrl());

        return '<img src = "'.$url.'"/>';
    }
}

За это время dd() распечатайте "http://localhost:8000/mpmlimages/NNYIPFxWz3TQGbtLJB2XEt9g8U8X370BarvRQ7oo.jpeg" то, что я и планировал.

и я прошу прощения за неправильный ответ, что моя версия laravel. Это была 5.7.19, а не 5.4.


После решения.. Отчет.

Проблема действительно в петле.

Во время обработки, поскольку xml_parser работает на основе событий, каждый открытый тег создает еще один цикл.

Каждый раз, когда открытый тег является элементом FIGURE, мой пользовательский парсер запускает FigureSubparser->start().

Проблема в том, что если существует родительский объект, у которого нет записи изображения, поскольку я не проверял наличие записи изображения, код возвращает значение null.

почему и get(), и first() в версии dd?

Aditya Thakur 17.05.2019 09:59

ошибка.. Я пробовал несколько версий крошечных кусочков кода..

GatesPlan 17.05.2019 10:01

какая версия laravel поддерживает getUrl()? на официальном сайте ничего не нашел

Gaurav Gupta 17.05.2019 10:02

.. о .. у меня 7.4, а getUrl() - это пользовательский метод модели. Он просто возвращает строку URL-адреса изображения, используя атрибут модели. return 'http://localhost:8000/mpmlimages/'.($this->filename); это все внутри getUrl() метод..

GatesPlan 17.05.2019 10:05

5.8 является последней доступной версией, и, пожалуйста, сделайте две вещи, покажите вам также собственный код и добавьте результат вашего запроса, получаете ли вы что-то или нет.

Gaurav Gupta 17.05.2019 10:08

можешь сделать dd($parser->mpml->images()->where('order', $parser->figureCounter)->first())

Aditya Thakur 17.05.2019 10:09

@GatesPlan там ???

Gaurav Gupta 17.05.2019 10:15

Вы запускаете это в цикле?

George Hanson 17.05.2019 10:21

@Адитья Тхакур; конечно я могу. Он создает объект модели MpmlImage. Это работает нормально. Я печатаю dd() в этой строке шаг за шагом.. и каждый шаг работает нормально..

GatesPlan 17.05.2019 10:23

Можете ли вы проверить, выдает ли $url->getUrl(); ту же ошибку?

Aditya Thakur 17.05.2019 10:26

@Джордж Хэнсон; а... наверное?? Код работает внутри xml_parser.

GatesPlan 17.05.2019 10:27

@GatesPlan Можете ли вы поделиться тем, как вы вызываете метод start?

George Hanson 17.05.2019 10:27

попробуйте print_r и без getUrl, чтобы вы могли проверить полный запуск функции и то, что вы получаете

Gaurav Gupta 17.05.2019 10:27

Я собираюсь работать сейчас. Спасибо всем! еще не уверен, но я думаю, что это своего рода решение. Спасибо @George Hanson. Попробуй ночью..

GatesPlan 17.05.2019 10:35

и спасибо @Gaurav Gupta. Я не заполнил достаточно информации только что, и вы продолжаете обрабатывать ??? меня..

GatesPlan 17.05.2019 10:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
15
300
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы запускаете это в цикле, поэтому, вероятно, для одного из результатов, которые вы запрашиваете, он ничего не возвращает. Из-за этого Laravel вернет null, для которого вы затем пытаетесь вызвать метод getUrl().

Вместо этого вы должны проверить, что у вас есть результат, прежде чем вызывать метод, например:

if ($record = $parser->mpml->images()->where('order', $parser->figureCounter)->first()) {
    $url = $record->getUrl();
}

Другие вопросы по теме