【问题标题】:Laravel Blade returns a "Undefined property" on an object that has a defined propertyLaravel Blade 在具有已定义属性的对象上返回“未定义属性”
【发布时间】:2015-08-28 22:26:32
【问题描述】:

我有一个包含多个字段的模型,包括两个存储 JSON 字典列表的文本字段。其中一个存储图像数据的工作正常;但是,当我尝试从刀片模板访问该属性时,第二个存储带有链接的字典列表会返回 Undefined property: stdClass::$title

如果我删除对我的链接属性的调用,所有其他属性(包括转换为对象数组的图像 JSON)都可以正常呈现。

我尝试dd() links 属性,它都显示它已设置,它是一个数组,并且它充满了具有我在失败时尝试访问的属性(标题、url)的对象.

但是,一旦我尝试实际访问它们,我就会得到 Undefined property 以获取我尝试访问的确切属性。

想知道有没有人遇到过这样的事情?真正奇怪的是,图像 JSON 数据在渲染时没有出现任何问题。这一切都与 Route Model 绑定绑定在一起,已验证可以正常工作。

Eloquent 模型中的属性获取器

public function getLinksAttribute() {
    if (!empty($this->attributes['links'])) {
        return json_decode($this->attributes['links']);
    }
}

public function getImagesAttribute() {
    if (!empty($this->attributes['images'])) {
        return json_decode($this->attributes['images']);
    }
}

调用链接属性的刀片模板部分,失败

@if (is_array($artist->links))
<div class="links">
    <h4>Links</h4>

        <ul>
            @foreach ($artist->links as $link)
                {{ $link->title }}, {{ $link->url }}
            @endforeach
        </ul>

</div>
    @endif

调用images属性的刀片模板部分,成功

@if (is_array($artist->images))
    <ul class="images">
        @foreach ($artist->images as $image)

            <li>{!! Html::image(Html::buildS3Url(array(
        "basedir" => "artists", "id" => $artist->id, "prefix" => $image->prefix,
        "extension" => $image->extension, "conversion" => "display")
    ), $artist->name) !!}</li>

        @endforeach
    </ul>
@endif

通过 tinker 将数据库中的 Json 编码数据,以及随后的 dd()

### links (doesn't work)
#tinker output
links: "[{"'title'":"test","'url'":"http:\/\/test.com"}]",,

# dd()
array:1 [▼
  0 => {#308 ▼
    +"'title'": "test"
    +"'url'": "http://test.com"
  }
]
### images (works)
# tinker output
images: "[{"prefix":1440693993,"extension":"png"},{"prefix":1440697822,"extension":"png"}]"

# dd()    
array:2 [▼
      0 => {#308 ▼
        +"prefix": 1440693993
        +"extension": "png"
      }
      1 => {#307 ▼
        +"prefix": 1440697822
        +"extension": "png"
      }
    ]

【问题讨论】:

    标签: php laravel laravel-5.1


    【解决方案1】:

    “未定义属性:stdClass::$title”

    好像您的链接之一缺少标题属性

    您可以通过以下方式查看:

    @foreach ($artist->links as $link)
      <?php if(property_exists($link, "title")) : ?>
        {{ $link->title }}
      <?php else : ?>
        NO TITLE [DEBUG: {{ dd($link) }}]
      <?php endif; ?>, {{ $link->url }}
    @endforeach
    

    我还发现了一件事:

    links: "[{"'title'":"test","'url'":"http:\/\/test.com"}]",,
    

    你的元素字段是' title '(带'),但必须是"title": "test"

    您可以通过删除参数名称中的单引号来修复它。

    【讨论】:

    • 这很奇怪,因为我粘贴的 JSON 是它加载的唯一内容。根据 $link 对象上的 dd(),它实际上确实有一个标题,只是当我尝试直接引用为 $link->title 时。是的,双引号/单引号业务很奇怪,不是吗?这直接来自对数组数组的 json_encode 调用。这可能是最好的线索,但似乎可能是 PHP 的问题,而不是 Laravel。
    • 在 php 交互式 shell 中进行修改后,我认为 Laravel $request 对象在我进行 JSON 编码之前以某种方式在键中添加了单引号。我尝试对确切的 JSON 字符串进行 json_decoding 并访问属性,但我得到了相同的未定义错误。然后我从头开始制作数组和json_encoded,没有单引号,并且解码/属性访问很好。
    • 就是那些多余的单引号。刀片 Html::macro 字面意思是使用我传递的输入名称links[$key]['title'],并带有单引号,并将它们作为键的一部分传递。感谢您指出这一点,我可能该买些新的老花镜了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多