【问题标题】:Static method throws error when returning object / string?返回对象/字符串时静态方法抛出错误?
【发布时间】:2014-09-07 16:24:17
【问题描述】:

在 Laravel 中,我创建了一个 Utils 文件,其中包含一些静态方法来执行各种操作。其中之一是从 Bandcamp 的 api 中获取数据。该函数是从一个名为releases.small 的子视图中调用的。我不确定此处是否涉及刀片继承,但这是视图的排列方式。

templates.default -> artists.view (@extends(templates.default)) -> releases.discography(包含在艺术家中.view) -> releases.small(包含在 release.discography 中)

在“releases.small”中,我有以下代码:

$data = Utils::apiAlbumData($release->bandcamp['url']);

下面是Utils::apiAlbumData($url)Utils::albumIdFromAlbumUrl($url) 的代码。那里有注释掉的 echo 语句,我输入这些语句只是为了验证这些功能是否正常工作。 albumIdFromAlbumUrl() 返回一个在file_get_contents 中使用的有效 ID 号。使用 json_decode 后,我可以访问 $data 属性,例如 $data->small_art_url,当我使用 print_r($data) 时,它看起来应该是这样。

public static function apiAlbumData($url) {

    $aid = Utils::albumIdFromAlbumUrl($url);
    // echo $aid; // this fine, echoes the expected number

    $json = file_get_contents("http://api.bandcamp.com/api/album/2/info?key=vatnajokull&album_id=" . $aid . "&debug");
    $data = json_decode($json);
    return $data;
    //return "some text";

    /*
    echo $data->small_art_url . "<br />";  // fine
    echo $data->album_id . "<br />";  // fine
    echo "<pre>";
    print_r ($data);  // fine
    //echo "</pre>";
    die;
    */

}

public static function albumIdFromAlbumUrl($url) {

    $json = file_get_contents ("http://api.bandcamp.com/api/url/1/info?key=vatnajokull&url=" . urlencode($url));
    $data = json_decode ($json);
    return $data->album_id;

}

如果我尝试从 laravel 类返回 $data 而不是仅将其打印到屏幕上,则会引发以下异常:

ErrorException (E_UNKNOWN) 未定义属性:stdClass::$album_id(查看:/home/shane478/beta/dv/app/views/releases/small.blade.php)(查看:/home/shane478/beta/dv/app/views /releases/small.blade.php)(查看:/home/shane478/beta/dv/app/views/releases/small.blade.php)

如果我尝试返回“一些文本”而不​​是 $data,则会发生同样的错误。然后它向我显示 Utils::albumIdFromAlbumUrl($url) ,其中包含 return $data->album_id;但我知道该函数工作正常,因为我在 apiAlbumData($url) 中回显了它的返回值。 'album_id' 不会出现在其他视图文件中。

我做错了什么?!

编辑 - 只需添加视图文件和控制器功能以响应下面的评论。可能信息太多... 我还剪掉了上面的一个视图,现在看起来像这样:

templates.default -> artists.view (@extends(templates.default)) -> releases.discography(包含在艺术家中.view)

这里是releases/discography.blade.php(包含注释掉的问题静态方法)

{{-- */ $i=1; /* --}}

<div data-equalizer>

  @foreach($artist->releases as $release)


  <div class="large-{{$discsize}} columns panel release-small" data-equalizer-watch>

    @if(Str::startsWith($release->image, 'http'))
    <img src="{{ $release->image }}" />
    @elseif(is_numeric ($release->image))
    <img   src="url-to-file-here" />
    @else
    <img src="http://example.com/{{ $release->image }}" />
    @endif

    <h4>{{ $release->title }}</h4>

    @foreach ($release->issues as $issue)
      {{ $issue->type }}: {{ date('Y', strtotime($issue->date)) }}<br />
      @foreach($issue->items as $item)
      {{ $item->cat_num }} | {{ $item->format->format }}
      @endforeach

      <?php // $data =  Utils::apiAlbumData($release->bandcamp['url']); ?>

    @endforeach

   </div>   

  {{-- */ $i++; /* --}}
  @if ( ($i - $rowsize == 1) && ($i < count($artist->releases)) )   
  {{-- */ $i=1; /* --}}
</div>
<div  data-equalizer>
@endif

@endforeach

</div>

这里是releases/view.blade.php

@extends('templates.default')

@section('pagetitle')
{{ $artist->name }} : 
@stop

@section('content')

<div class="large-12">
  <h2>{{ Utils::sortOrder($artist->name) }}</h2>
  {{ nl2br($artist->about) }}
</div>

@include('releases.discography')

@stop

这里是负责的控制器方法

public function view($slug) {

    $artist = Artist::where('slug', '=', $slug)->first();

    list ($discSize, $discsPerRow) = Utils::calculateRowItems(count ($artist->releases));

    return View::make('artists.view')->withArtist($artist)->withDiscsize($discSize)->withRowsize($discsPerRow);

}

【问题讨论】:

  • 您的错误来自刀片模板 - 但您没有展示如何将数据传递给该模板。这让我想知道问题是否不在于您的静态调用,而在于视图创建方面的其他问题。

标签: php exception laravel return-value static-methods


【解决方案1】:

您应该确保 file_get_contents 返回一个包含对象的 json 字符串并且没有错误。所以你应该检查:

$data = json_decode ($json);
if (is_object($data) && $data->error != true) {
    return $data->album_id;
}
return false;

【讨论】:

  • 我试过了,但没有运气。我认为 json 没问题,因为我可以 print_r 它并在静态函数中访问 $data->album_id 和 $data->whatever_else。 print_r 的结果开始于 stdClass Object ( [band_id] => 2759811402 - 我认为应该是这样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
相关资源
最近更新 更多