簡體   English   中英

Yii框架未將函數從庫獲取到控制器(使用class.php文件)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM