2013-05-17 37 views
2

我想知道是否有在每個視圖文件中運行相同代碼的理想方式。Yii,如何擁有在所有視圖中運行的控制器代碼

而不是必須修改所有控制器和所有操作並添加代碼片段,是否有辦法讓控制器和操作始終由任何視圖調用(不是部分視圖)?

我在所有視圖中需要的是獲取當前登錄用戶並獲取其他相關表中的數據的代碼。

以下是對的觀點

public function actionIndex() 
{ 
    // the following line should be included for every single view 
    $user_profile = YumUser::model()->findByPk(Yii::app()->user->id)->profile; 

    $this->layout = 'column2'; 
    $this->render('index', array('user_profile' => $user_profile)); 

} 
+3

如果你需要重複控制器邏輯,它不應該在那裏。您可以創建一個服務類來處理共享邏輯。 – Bart

+0

好吧@Bart謝謝你,任何建立一個服務類來處理共享邏輯的建議? – Martin

回答

3

是的,這是一個可能的動作的方法之一,採用了佈局和基本控制器。

如果您來自Yii代碼生成器,應在components文件夾中有Controller類。

如果你的控制器ExampleController extends Controller代替CController

Controller你可以分配:

public function getUserProfile() { 
    return YumUser::model()->findByPk(Yii::app()->user->id)->profile; 
} 

而在你的佈局文件:

<?php echo CHtml::encode($this->getUserProfile()); ?> 

因爲$this指控制器,和控制器將繼承名爲$user_profile的屬性。

但是,您應該在登錄會話時指定profile和其他不會因setState而異的內容。通過這種方式,您可以執行如下操作:

<p class="nav navbar-text">Welcome, <i><?php echo Yii::app()->User->name; ?></i></p> 

在MySQLUserIdentity中設置狀態的示例(由我完成)。

class MySqlUserIdentity extends CUserIdentity 
{ 

    private $_id; 

    public function authenticate() 
    { 
    $user = User::model()->findByAttributes(array('username' => $this->username)); 
    if($user === null) 
     $this->errorCode = self::ERROR_USERNAME_INVALID; 
    else if($user->password !== md5($this->password)) 
     $this->errorCode = self::ERROR_PASSWORD_INVALID; 
    else 
    { 
     $this->_id = $user->id; 
     $this->setState('username', $user->username); 
     $this->setState('name', $user->name); 
     $this->setState('surname', $user->surname); 
     $this->setState('email', $user->email); 
     $this->errorCode = self::ERROR_NONE; 
    } 
    return !$this->errorCode; 
    } 

    public function getId() 
    { 
    return $this->_id; 
    } 
} 
+0

我不知道組件控制器,那很好! 但@Jorge在控制器中輸入該代碼時會返回一個分析錯誤,因爲它似乎只接受字符串和變量中的數組。 – Martin

+0

它不是一個組件,它位於組件文件夾lol中。你可以創建一個名爲base_controllers的文件夾,並將其設置爲自動加載config/main.php – JorgeeFG

+0

我更新了我的答案,忘記了對象的屬性必須在對象實例化時刻保持不變,並將其移至函數中。 – JorgeeFG

3

在發表評論時,將重複邏輯放在控制器中並不好。記住MVC邏輯 - 厚模型,明智的看法和薄控制器。爲了顯示登錄的用戶數據,我建議創建一個小部件。您可以將該小部件放置在您的佈局或任何視圖中。

最簡單的一種是

class MyWidget extends CWidget 
{ 
    private $userData = null; 

    public function init() 
    { 
     $this->userData = YumUser::model()->findByPk(Yii::app()->user->id)->profile; 
     // Do any init things here 
    } 

    public function run() 
    { 
     return $this->render('viewName', array('user_profile' => $userData)); 
    } 
} 

然後在任何視圖(或佈局這實際上是視圖太),你可以使用它:

$this->widget('path.to.widget.MyWidget'); 

欲瞭解更多信息請參閱docs on Yii widgets

相關問題