我的代码在laravel帮助函数dd()

时间:2019-05-17 07:47:56

标签: php laravel

嗯..我不知道怎么回事,但是..我的代码

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

不能仅在dd()帮助程序功能之外工作。它产生

  

在出现空错误时调用成员函数getUrl()。

在里面,

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

它可以正常工作并产生适当的网址字符串...?这个问题实际上是在一周前发生的,即使我什么也没做,它还是可以解决。现在,这再次发生。

任何有类似经验的人,你会分享你的知识吗?

错误一定是有原因的,我对此没有一点头绪。


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。

1 个答案:

答案 0 :(得分:2)

听起来您可能是在一个循环中运行它,所以对于您查询的结果之一来说,它可能没有返回任何内容。因此,Laravel将返回null,然后您尝试在其上调用getUrl()方法。

相反,在调用该方法之前,您应该检查是否有结果,例如:

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