Ну... я не могу понять, как это могло произойти, но... мой код
$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.
ошибка.. Я пробовал несколько версий крошечных кусочков кода..
какая версия laravel поддерживает getUrl()? на официальном сайте ничего не нашел
.. о .. у меня 7.4, а getUrl() - это пользовательский метод модели. Он просто возвращает строку URL-адреса изображения, используя атрибут модели. return 'http://localhost:8000/mpmlimages/'.($this->filename); это все внутри getUrl() метод..
5.8 является последней доступной версией, и, пожалуйста, сделайте две вещи, покажите вам также собственный код и добавьте результат вашего запроса, получаете ли вы что-то или нет.
можешь сделать dd($parser->mpml->images()->where('order', $parser->figureCounter)->first())
@GatesPlan там ???
Вы запускаете это в цикле?
@Адитья Тхакур; конечно я могу. Он создает объект модели MpmlImage. Это работает нормально. Я печатаю dd() в этой строке шаг за шагом.. и каждый шаг работает нормально..
Можете ли вы проверить, выдает ли $url->getUrl(); ту же ошибку?
@Джордж Хэнсон; а... наверное?? Код работает внутри xml_parser.
@GatesPlan Можете ли вы поделиться тем, как вы вызываете метод start?
попробуйте print_r и без getUrl, чтобы вы могли проверить полный запуск функции и то, что вы получаете
Я собираюсь работать сейчас. Спасибо всем! еще не уверен, но я думаю, что это своего рода решение. Спасибо @George Hanson. Попробуй ночью..
и спасибо @Gaurav Gupta. Я не заполнил достаточно информации только что, и вы продолжаете обрабатывать ??? меня..






Похоже, вы запускаете это в цикле, поэтому, вероятно, для одного из результатов, которые вы запрашиваете, он ничего не возвращает. Из-за этого Laravel вернет null, для которого вы затем пытаетесь вызвать метод getUrl().
Вместо этого вы должны проверить, что у вас есть результат, прежде чем вызывать метод, например:
if ($record = $parser->mpml->images()->where('order', $parser->figureCounter)->first()) {
$url = $record->getUrl();
}
почему и
get(), иfirst()в версии dd?