在Laravel中,我创建了一个带有一些静态方法的Utils文件来做各种事情。其中一个是从Bandcamp的api中获取数据。该函数从名为releases.small的子视图中调用。我不确定这里是否涉及刀片继承,但这是视图的排列方式。
templates.default - > artists.view (@ extends(templates.default)) - > releases.discography (包含在artists.view中) - > releases.small (包含在releases.discography中)
在'releases.small'中我有以下代码:
$data = Utils::apiAlbumData($release->bandcamp['url']);
以下是Utils::apiAlbumData($url)
和Utils::albumIdFromAlbumUrl($url)
的代码。那里有注释掉的echo语句,我只是为了验证函数是否正常工作。 albumIdFromAlbumUrl()
会返回file_get_contents
中使用的有效ID号。使用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返回$ 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)
如果我尝试返回“some text”而不是$ data,则会发生同样的错误。然后它显示我的Utils :: albumIdFromAlbumUrl($ url),其行返回$ data-&gt; album_id ;但我知道该函数正常工作,因为我在apiAlbumData($ url)中回显了它的返回值。 'album_id'不会显示在其他任何视图文件中。
我做错了什么?!
编辑 - 只需添加视图文件和控制器功能以响应下面的评论。太多信息可能...... 我也从上面删除了一个观点,现在看起来像这样:
templates.default - &gt; artists.view (@ extends(templates.default)) - &gt; releases.discography (包含在artists.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);
}
答案 0 :(得分:0)
你应该确保file_get_contents返回一个内部有对象的json字符串,并且没有错误。所以你应该检查:
$data = json_decode ($json);
if (is_object($data) && $data->error != true) {
return $data->album_id;
}
return false;