Zend Framework _передача других действий внутри того же контроллера - PullRequest
3 голосов
/ 28 июня 2010

Как я могу переадресовать другие действия внутри того же контроллера, избегая повторения всего процесса отправки?

Пример: если я указываю на пользовательский контроллер, действие по умолчанию - indexAction () внутри этой функции, я использую _forwad ('list') ... но все процессы отправки повторяются .. и я не думаю, что

Что такое правильный путь?

Ответы [ 4 ]

6 голосов
/ 28 июня 2010

Обычно вы устанавливаете маршруты, чтобы перенаправлять пользователей на правильное (по умолчанию) действие вместо действия индекса (читайте, как перенаправить с данного маршрута с помощью Zend_Router). Но вы можете делать все вручную, если вы действительно этого хотите (однако это называется «написание хакерского кода для достижения чего-то грязного») непосредственно из контроллера.

Измените ваш "скрипт просмотра", чтобы он отображался, затем вызовите метод действия ....

// inside your controller...
public function indexAction() {
  $this->_helper->viewRenderer('foo');  // the name of the action to render instead
  $this->fooAction();  // call foo action now
}

Если вы часто используете этот «трюк», возможно, вы можете написать базовый контроллер, который вы расширяете в своем приложении, который может просто иметь такой метод:

abstract class My_Controller_Action extends Zend_Controller_Action {
   protected function _doAction($action) {
      $method = $action . 'Action';
      $this->_helper->viewRenderer($action);
      return $this->$method();   // yes, this is valid PHP
   }
}

Затем вызовите метод из вашего действия ...

class Default_Controller extends My_Controller_Action
   public function indexAction() {
      if ($someCondition) {
         return $this->_doAction('foo');
      }

      // execute normal code here for index action
   }
   public function fooAction() {
      // foo action goes here (you may even call _doAction() again...)
   }
}

ПРИМЕЧАНИЕ : это не официальный способ сделать это, но является решением.

1 голос
/ 26 апреля 2017

Мы также можем использовать этот помощник для перенаправления

  $this->_helper->redirector->gotoSimple($action, $controller, $module, $params);

  $this->_helper->redirector->gotoSimple('edit'); // Example 1

  $this->_helper->redirector->gotoSimple('edit', null, null, ['id'=>1]); // Example 2 With Params
0 голосов
/ 01 июня 2013

Вы также можете создать маршрут.Например, у меня в /application/config/routes.ini есть раздел:

; rss
routes.rss.route                = rss
routes.rss.defaults.controller  = rss
routes.rss.defaults.action      = index

routes.rssfeed.route                = rss/feed
routes.rssfeed.defaults.controller  = rss
routes.rssfeed.defaults.action      = index

Теперь вам нужно только одно действие, и это действие индекса, но туда также идет рекссесс rss / feed.

public function indexAction()
{
    ...
}
0 голосов
/ 28 июня 2010

Если вы не хотите повторной отправки, нет причины, по которой вы не можете просто вызвать действие - это просто функция.

class Default_Controller extends My_Controller_Action
{
    public function indexAction()
    {
        return $this->realAction();
    }

    public function realAction()
    {
        // ...
    }
}
...