代码之家  ›  专栏  ›  技术社区  ›  Dan Mason

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

  •  0
  • Dan Mason  · 技术社区  · 12 年前

    我正在使用一个名为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,并将其自动加载到我的控制器中,但我不确定这是否有必要。

    我已经把它装进我的 配置.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),
        ));
    }
    

    另请参阅下面的代码,其中有一个名为 获取实例 由于某种原因,它不能很好地与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;
        } 
    

    如果你有什么建议,我将不胜感激。谢谢

    1 回复  |  直到 12 年前
        1
  •  0
  •   Marko D    12 年前

    你没有初始化 $spotify 在任何地方,php都可以 stdClass 默认情况下,因为您使用该变量为成员属性分配类似的值,但当您尝试对其调用不存在的方法时,它失败了。

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

    $spotify = MetaTune::getInstance();