Как получить доступ к одному действию контроллера внутри другого действия контроллера?

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);
}

Ошибка 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
Теги:
cakephp

4 ответа

1
Лучший ответ

Обычно, если вы пытаетесь получить доступ к функции в одном контроллере с другого контроллера, у вас есть фундаментальный недостаток в вашей логике проекта.

Но в общем случае использование объекта:

$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();
  • 0
    Не работает я использую $UserData=new UsersController(); $UserData->user_info(); , Я получаю сообщение об Error: Class 'UsersController' not found
  • 0
    Взгляните на это: stackoverflow.com/questions/19344988/… Может помочь IDK. Тем не менее, если вы вызываете контроллер из другого контроллера, ваш подход к кодированию ошибочен.
Показать ещё 10 комментариев
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 ---
}

И чтобы он не нуждался в расширении контроллеров, просто убедитесь, что ваша модель сообщений и пользователей связана друг с другом, в противном случае вы можете привязатьModel или использовать ClassRegistry :: init ("Пользователь") → например.

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

Попробуйте requestAction функции cakephp

$ result = $this-> requestAction (массив ('controller' => 'users', 'action' => 'user_info'));

  • 0
    requestAction не работает. Получение нулевого результата.
  • 0
    для этого вам нужно вернуть данные из вызванного вами метода контроллера. Попробуйте посмотреть на это: book.cakephp.org/2.0/en/controllers.html и попробуйте вернуть некоторую строку в самой первой строке, чтобы вы поняли, есть ли Любая ошибка в вашем письменном коде или requestAction имеет некоторые проблемы .. Дайте мне знать, что происходит
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню