2014-11-06 76 views
0

我正在使用cakephp-2.x。我有一個函數名user_info()UsersController.php我要訪問這個在另一個控制器名稱MessagesController.php如何訪問另一個控制器動作中的一個控制器動作?

碼 -

UsersController.php

public function user_info(){ 
    $user_id=$this->Session->read('Auth.User.id'); 
    $data=$this->User->findById($user_id); 
    $this->set('user_info',$data); 
} 

MessagesController.php

public function index(){ 
    //$userInfo=new UsersController(); 
    //$userInfo->user_info(); 
    $this->user_info(); 
    pr($data); 
} 

錯誤訊息 -

Fatal Error 

Error: Call to undefined method MessagesController::user_info() 
File: E:\xampp\htdocs\2014\myshowcam\msc\app\Controller\MessagesController.php 
Line: 18 

Notice: If you want to customize this error message, create app\View\Errors\fatal_error.ctp 

回答

1

通常,如果您嘗試從另一個控制器訪問某個控制器中的某個功能,那麼您的項目邏輯中存在一個基本缺陷。

但總的來說對象使用是這樣的:

$otherController = new whateverMyControllerNameIs(); 
$otherController->functionName(); 

但是我不熟悉不夠用蛋糕來告訴你做這樣的事的陷阱。例如,我不知道這會對路由做什麼,或者需要其他變量/對象來正確初始化控制器。

編輯:

價:CakePHP 2.3.8: Calling Another Controller function in CronController.php

App::import('Controller', 'Products'); // mention at top 
// Instantiation // mention within cron function 
$Products = new ProductsController; 
// Call a method from 
$Products->ControllerFunction(); 
+0

不工作,我正在使用'$ UserData = new UsersController(); \t \t $ UserData-> user_info();'。我得到'錯誤:類'UsersController'找不到' – Developer 2014-11-06 06:30:22

+0

看看這個:http://stackoverflow.com/questions/19344988/cakephp-2-3-8-calling-another-controller-function-in- croncontroller-php可能會幫助IDK。仍然說,如果你必須從另一個控制器調用控制器,那麼你的編碼方法有缺陷。 – Wranorn 2014-11-06 06:34:59

+0

是的,它正在工作我正在使用'App :: import('Controller','Messages');'但我得到另一個問題'錯誤:調用成員函數讀取()非對象'如何修復那個問題? – Developer 2014-11-06 06:46:38

0

嘗試cakephp中的requestAction功能

$結果= $這 - > requestAction(陣列( '控制器'=> '用戶',' action'=>'user_info'));

+0

requestAction不工作。獲得空結果。 – Developer 2014-11-06 06:48:55

+0

您需要從調用的控制器方法返回數據請嘗試看看這個:http://book.cakephp.org/2.0/en/controllers。html並嘗試在第一行返回一些字符串,以便您瞭解在您的書寫代碼中是否有任何錯誤,或者requestAction有一些問題。如果您沒有在user_info方法中獲取會話ID,請告訴我發生了什麼 – 2014-11-06 06:56:47

+0

,你可以在$ this-> requestAction(array('controller'=>'users','action'=>'user_info'),$ user_id)中的MessagesController的索引方法中傳遞user_id。 – 2014-11-06 07:17:45

0

爲什麼會簡單,什麼時候可以複雜?

所有用戶模型的註冊用戶的信息是通過以下方式進行訪問:

AppController.php

public $user_info; /* global scope */ 

public function beforeFilter(){ 
    $this->user_info = $this->Auth->user(); // for access user data in any controller 
    $this->set('user_info_view',$this->Auth->user()); // for access user data in any view or layout 
} 

MessagesController.php

public function index(){ 

debug($this->user_info); 
$my_messages = $this->Message->find('all', 
    array('conditions' => array('Message.user_id' => $this->user_info['id'])) 
} 
.... 

佈局或view.ctp

<?php echo $user_info_view['name']; ?> // email, etc 
0

爲什麼不利用CakePHP處理關係的方式?有一種非常簡單的方法可以實現你想要做的事情,而不用在其他控制器中擴展控制器或加載,這在你的例子中似乎過分了。

裏面的AppController的beforeFilter()

Configure::write('UserId', $this->Session->read('Auth.User.id')); 

這將允許您從模型

內,您的用戶模型訪問用戶名,創建下面的函數

/** 
* Sample query which can be expanded upon, adding fields or contains. 
* 
* @return array The user data if found 
*/ 
public function findByUserId() { 
    $user = $this->find('first', array(
     'conditions' => array(
      'User.id' => Configure::read('UserId') 
     ) 
    )); 

    return $user; 
} 

您的用戶控制器(最小的是更好的,不是嗎?)

public function user_info() { 
    $this->set('user', $this->User->findByUserId()); 
} 

郵件裏面控制器

public function index() { 
    $this->set('user', $this->Message->User->findByUserId()); 
    // --- Some more stuff here --- 
} 

就是這樣,沒有必要將觸角延伸控制器,只要確保你的信息和用戶模型相互關聯,例如你可以bindModel或使用ClassRegistry :: init('User') - >。

相關問題