如何在另一个控制器动作中访问一个控制器动作?

时间:2014-11-06 06:19:41

标签: php cakephp

我正在使用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

4 个答案:

答案 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;例如。