[英]Yii framework not getting functions from library into controller (using class.php files)
我正在使用一个名为MetaTune的Spotify库,并且能够在CodeIgniter中轻松完成此操作,但是使用Yii遇到了一些麻烦的问题,但是目前它开始说:
Fatal error: Call to undefined method stdClass::searchTrack() in ....public_html/Yii/news/protected/controllers/NewsController.php on line 67
但是,该功能在那里。 该库中的文件都有一个.class.php后缀(例如MetaTune.class.php ),而libray文件都存储在:
yii/application/protected/vendors/Metatune
使用Codeigniter,我在文件夹之外创建了一个额外的spotify.php并将其自动加载到控制器中,但是我不确定是否有必要。
我已经用以下命令将其加载到我的config.php中:
'import'=>array(
'application.models.*',
'application.components.*',
'application.vendors.metatune.*',
),
这是控制器代码:
public function actionView($id)
{
$model=$this->loadModel($id);
$spotify = MetaTune::getSomething();
$hello = $model->title;
Yii::import('application.vendors.metatune.MetaTune');
$spotify->autoAddTracksToPlayButton = true; // Will add all searches for tracks into a list.
$spotify->playButtonHeight = 330; // For viewing the entire playlist
$spotify->playButtonTheme = "dark"; // Changing theme
$spotify->playButtonView = "coverart"; // Changing view
try
{
$tracks = $spotify->searchTrack($hello);
$tracks = $spotify->getPlayButtonAutoGenerated($hello);
}
catch (MetaTuneException $ex)
{
die("<pre>Error\n" . $ex . "</pre>");
}
$song = 'tracks';
$this->render('view',array(
'model'=>$this->loadModel($id),
));
}
还请参见下面的代码,该代码中有一个名为getInstance的函数,由于某种原因它不能与Yii很好地配合使用,我不确定是否可以更改此设置,因为我使用它可以将MetaTune导入到CodeIgniter控制器中而没有任何问题。
只是MetaTune.class.php代码的一部分:
Yii::import('application.vendors.metatune.Artist');
Yii::import('application.vendors.metatune.Album');
Yii::import('application.vendors.metatune.Track');
Yii::import('application.vendors.metatune.CacheRequest');
Yii::import('application.vendors.metatune.MBSimpleXMLElement');
Yii::import('application.vendors.metatune.SpotifyItem');
Yii::import('application.vendors.metatune.MetaTuneException');
....
class MetaTune {
const CACHE_DIR = 'application/vendors/metatune/cache/'; // Cache directory (must be writable) relative to this file
const USE_CACHE = false; // Should caching be activated?
const CACHE_PREFIX = "METATUNE_CACHE_"; // prefix for cache-files.
const SERVICE_BASE_URL_SEARCH = "http://ws.spotify.com/search/1/";
const SERVICE_BASE_URL_LOOKUP = "http://ws.spotify.com/lookup/1/";
const PLAYBUTTON_BASE_URL = "https://embed.spotify.com/?uri=";
public $autoAddTracksToPlayButton = false;
private $list = array();
// Holds instance
private static $instance;
.....
public static function getSomething()
{
if (!isset(self::$instance))
{
$class = __CLASS__;
self::$instance = new $class;
}
return self::$instance;
}
.....
public function searchTrack($name, $page = 1)
{
$url = self::SERVICE_BASE_URL_SEARCH . "track?q=" . $this->translateString($name) .
$this->addPageSuffix($page);
$contents = $this->requestContent($url);
$xml = new MBSimpleXMLElement($contents);
$tracks = array();
foreach ($xml->track as $track)
{
$tracks[] = $this->extractTrackInfo($track);
}
if ($this->autoAddTracksToPlayButton) {
$this->appendTracksToTrackList($tracks);
}
return $tracks;
}
如果您有任何建议,我将不胜感激。 谢谢。
您没有在任何地方初始化$spotify
,并且php在默认情况下将其设置为stdClass
,因为您正在使用该变量为成员属性分配值,但是当您尝试对其不存在的方法进行调用时,它失败了。
解决方案:在使用前将其初始化
$spotify = MetaTune::getInstance();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.