2012-12-14 44 views
2

是Yii :: app() - >名字緩存在yii上嗎?定期使用它很好嗎?我決定在我的佈局上使用自定義頁面標題,並在控制器上使用它。是yi上緩存的Yii :: app() - >名字?

$this->pageTitle = Yii::app()->name . ":" . $action 
+0

它是如何讓上面的區別嗎? – itachi

+1

@itachi - 他們問,如果它被加載到每個頁面上,可能會有性能損失(例如,如果Yii :: app的新實例每次都被實例化或者類似的東西) – ernie

回答

8

它不緩存緩存,但它是確定使用它,只要你想盡可能多。從the guide

應用程序對象通過條目腳本實例化爲單例。應用程序單例可以通過Yii :: app()在任何地方訪問。

所以對象已經存在,而你只是訪問它讀取name屬性。


更新:爲了更好的理解,讓我們追溯the application lifecycle

  • 入口腳本的index.php創建應用程序,with Yii::createWebApplication
  • Yii::createWebApplication電話Yii::createApplication,然後創建一個新的CWebApplication類的對象,這意味着其構造defined in parent CApplication)被調用。 此構造設置應用單對象

    Yii::setApplication($this); 
    

    然後它執行的第一個4個步驟的生命週期,它是(從應用程序的生命週期link above):

    1. 預初始化應用程序CApplication::preinit();即:$this->preinit();
    2. 設置類自動加載器和錯誤處理;即$this->initSystemHandlers();
    3. 註冊核心應用程序組件;即$this->registerCoreComponents();
    4. 加載應用程序配置;即$this->configure($config);。這設置了name
    5. 附加行爲;即$this->attachBehaviors($this->behaviors);
      加載靜態應用程序組件;即$this->preloadComponents();
      CApplication::init();$this->init();

    應用對象時創建由createApplication返回到createWebApplication初始化應用程序。

  • 然後,該同一對象用於調用在入口腳本的run() method

    Yii::createWebApplication($config)->run(); 
    

    run方法然後進行生命週期的其餘部分:

    1. (6 )發起一個onBeginRequest事件;即:$this->onBeginRequest(new CEvent($this));

    2. (7)處理用戶請求(具有$this->processRequest();):

      • 有關請求的收集信息;
      • 創建控制器;
      • 運行控制器;

        因此,當正在運行,如果調用Yii::app()同一對象這是在createApplication創建,並在構造函數中設置,使用,所以在創建控制器沒有新對象,屬性是從剛剛取出已經存在的對象。

    3. (8)提高onEndRequest事件;即:$this->onEndRequest(new CEvent($this));

+0

它被作爲你的一部分讀入配置,所以它不會添加任何加載時間:-) – acorncom

+0

wpleet看到我的更新,我試圖解釋一些事情,現在應該很清楚,在獲取應用程序時沒有太多的額外工作名稱,如果你有疑問做評論。同樣,@acorncom提到,當讀入配置時,名稱被設置。 –

0

它好經常使用呢?

不,它不好,因爲如果有一天您需要修改應用程序名稱,那麼在每個控制器中更改它都會有問題。我想更好的方法是直接在layout中重新聲明Yii::$app->name

在佈局的begiging,大概在views/layout/main.php添加

Yii::$app->name = Yii::$app->name . ':' . Yii::$app->getView()->id; 
相關問題