Я использую 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);
}
Ошибка Message-
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
Обычно, если вы пытаетесь получить доступ к функции в одном контроллере с другого контроллера, у вас есть фундаментальный недостаток в вашей логике проекта.
Но в общем случае использование объекта:
$otherController = new whateverMyControllerNameIs();
$otherController->functionName();
Тем не менее, я недостаточно знаком с пирожным, чтобы рассказать вам об этом. Например, я понятия не имею, что это будет делать для маршрутов или какие другие переменные/объекты необходимы для правильной инициализации контроллера.
РЕДАКТИРОВАТЬ:
Ссылка: CakePHP 2.3.8: вызов функции другого контроллера в CronController.php
App::import('Controller', 'Products'); // mention at top
// Instantiation // mention within cron function
$Products = new ProductsController;
// Call a method from
$Products->ControllerFunction();
Почему бы не воспользоваться тем, как 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 ---
}
И чтобы он не нуждался в расширении контроллеров, просто убедитесь, что ваша модель сообщений и пользователей связана друг с другом, в противном случае вы можете привязатьModel или использовать ClassRegistry :: init ("Пользователь") → например.
Почему бы просто, когда может осложниться?
Вся информация для зарегистрированного пользователя модели пользователя доступна следующим образом:
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
Попробуйте requestAction функции cakephp
$ result = $this-> requestAction (массив ('controller' => 'users', 'action' => 'user_info'));
$UserData=new UsersController(); $UserData->user_info();
, Я получаю сообщение обError: Class 'UsersController' not found