2014-09-07 1 views
0

В Laravel Я создал файл Utils с некоторыми статическими методами, чтобы делать разные вещи. Один из них - захватить данные из api Bandcamp. Функция вызывается из подзаголовка, называемого release.small. Я не уверен, что здесь наложено лезвие или нет, но вот как устроены представления.Статический метод выдает ошибку при возврате объекта/строки?

templates.default ->artists.view (@extends (templates.default)) ->releases.discography (входит в artists.view) ->releases.small (входит в релизах .discography)

В 'releases.small' У меня есть следующий код:

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

Ниже приведен код для Utils::apiAlbumData($url) и Utils::albumIdFromAlbumUrl($url). Здесь прокомментированы эхо-сообщения, которые я только что проверил, чтобы функции работали. albumIdFromAlbumUrl() возвращает действительный номер идентификатора, который используется в file_get_contents. После использования json_decode я могу получить доступ к атрибутам данных $, таким как $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 вместо просто напечатать его на экран следующее исключение:

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)

The ve ry такая же ошибка возникает, если я пытаюсь вернуть «некоторый текст» вместо $ data. Затем он показывает мне Utils :: albumIdFromAlbumUrl ($ url), который имеет строку return $ data-> album_id; но я знаю, что эта функция работает нормально, потому что я повторил ее возвращаемое значение в apiAlbumData ($ url). 'album_id' не отображается ни в одном из других файлов вида.

Что я делаю неправильно ?!

EDIT - просто добавьте в просмотр файлы и функцию контроллера в ответ на комментарий ниже. Слишком много информации, вероятно, ... Я также вырезать один из видов сверху, теперь выглядеть следующим образом:

templates.default ->artists.view (@extends (шаблонов. по умолчанию)) ->releases.discography (включено в артисты.вид)

здесь 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); 

} 
+0

YOu ошибка исходит из шаблона клинка - но вы не показываете, как вы передаете данные этому шаблону. Это заставляет меня задаться вопросом, не проблема ли в вашем статическом вызове, а что-то еще вокруг создания вида. –

ответ

0

вам должен убедиться, что file_get_contents возвращает json string с объектом внутри и не имеет ошибок. Поэтому вы должны проверить:

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

Я пробовал это, но не повезло. Я думаю, что json в порядке, поскольку я могу распечатать его и получить доступ к $ data-> album_id и $ data-> whatever_else внутри статической функции. Результат print_r начинается с ** stdClass Object ([band_id] => 2759811402 ** - это как и должно быть, я думаю ?. – Shane

Смежные вопросы