Yii框架未将函数从库中获取到控制器(使用class.php文件)

Yii框架未将函数从库中获取到控制器(使用class.php文件),php,web,yii,spotify,Php,Web,Yii,Spotify,我正在使用一个名为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的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),库文件都存储在:

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),
    ));
}

如果您有任何建议,我将不胜感激。谢谢。

您没有在任何地方初始化
$spotify
,php在默认情况下将其放入
stdClass
,因为您使用该变量为成员属性赋值,但在尝试调用unexisting方法时失败

解决方案:在使用前对其进行初始化


$spotify=MetaTune::getInstance()

您是否尝试过将“application.vendors.metatune.*”更改为“application.vendors.metatune.*”@文件夹实际上是metatune/和文件metatune,但我尝试过使用类似的名称,但没有用。谢谢你的建议。Yii使用延迟加载,它只加载它认为需要的文件。因此,如果存在不属于类的独立函数,则可能会出现问题。你试过在配置文件中使用预加载部分吗?@Pitchen,我想我在上面的导入数组中已经使用过了。。。我增加了额外的代码价格,我认为可能是getInstance造成了这些问题。我本来就有这个问题,但是我不喜欢getInstance,因为它将它用于另一个函数来完成文件上传,所以我把它改成了getSomething,并尝试使用它,但它不起作用。你是说我不喜欢
getInstance
?这是来自
MetaTune
类的方法,它也存在于其他哪些类中并不重要,因为您使用
MetaTune::
Ah调用它可能我误解了错误,基本上我得到了一个充满错误的页面,从
YiiBase::include(MetaTune.php)[]:无法打开流:没有这样的文件或目录
,然后是
#0+/studhome/1/0908037/public_html/Yii/framework/YiiBase.php(421):YiiBase::autoload()#1未知(0):YiiBase::autoload(“MetaTune”)#2–/studhome/1/0908037/public#html/Yii/news/protected/controllers/newsconner.php(59):spl#u autoload调用(“MetaTune”)
它找不到我的metatune文件,是因为metatune.class.php吗?将
metatune.class.php
重命名为
metatune.php
确定尝试了它,但不幸的是它仍然产生相同的错误,那么这是否意味着它实际上找不到该文件夹…库中还有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;
    }