我正在使用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
答案 0 :(得分: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();
答案 1 :(得分:0)
尝试使用cakephp的requestAction功能
$ result = $ this-> requestAction(array('controller'=>'users','action'=>'user_info'));
答案 2 :(得分: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
答案 3 :(得分:0)
为什么不利用CakePHP处理关系的方式?在没有扩展控制器或加载其他控制器的情况下,有一种非常简单的方法可以实现您尝试做的事情,这对您的示例来说似乎过多。
在AppController内部的beforeFilter()
Configure::write('UserId', $this->Session->read('Auth.User.id'));
这将允许您从模型中访问UserID
在用户的模型中,创建以下功能
/**
* 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(&#39;用户&# 39;) - &GT;例如。