Zend: перенаправление на действие с параметрами

Я использую zend framework. Я использую следующее заявление для перенаправления на другое действие.

$this->_helper->redirector('some_action'); 

Выше инструкция работает отлично, и вызывается «some_action». Теперь я хочу передать некоторые параметры «some_action» следующим образом.

 some_action?uname=username&umail=username@example.com 

И как получить параметры в вызываемом действии. Обычно мы делаем так:

 $userName = $_REQUEST['uname']; $usermail = $_REQUEST['umail']; 

Как это сделать? Пример кода, пожалуйста. благодаря

Используйте метод Zend_Controller_Action::redirect() (который просто переходит к вспомогательному методу Sarfraz)

 $this->redirect('/module/controller/action/username/robin/email/robin@example.com'); 

Примечание. _redirect() устарел из Zend Framework 1.7. Вместо этого используйте redirect() .

И затем в вызванном действии:

 $username = $this->_getParam('username'); $email = $this->_getParam('email'); 

_getParam () принимает второй необязательный аргумент, который устанавливается в качестве значения по умолчанию, если параметр не найден.

вы можете попробовать с перенаправителем:

 $params = array('user' => $user, 'mail' => $mail); $this->_helper->redirector($action, $controller, $module, $params); 

Вы можете попробовать следующее:

  $this->_redirector->gotoUrl('/my-controller/my-action/param1/test/param2/test2'); 

Вы также можете добавить $ params, например, для userid

 public function indexAction () { $auth = Zend_Auth::getInstance(); if ($auth->hasIdentity()) { // Identity exists; get it $identity = $auth->getIdentity(); $this->_redirect('/user/profile/' . $identity->user_id); } else { $this->_redirect('/user'); } } 

Я забыл упомянуть, конечно, это предполагает, что у вас есть настройка маршрутизации, чтобы принять параметр $ param. В качестве примера маршрутизация будет выглядеть примерно так для страницы, которая перенаправляется в приведенном выше примере:

/application/configs/application.ini

 resources.router.routes.user-profile.route = /user/profile/:id resources.router.routes.user-profile.defaults.module = default resources.router.routes.user-profile.defaults.controller = user resources.router.routes.user-profile.defaults.action = profile 

Как вы получаете сортировку параметров, зависит от того, где вы находитесь,

Вам не нужно ловить запрос $ param для достижения того, что вы хотите сделать здесь. Вы просто используете помощник FlashMessenger для добавления сообщения в стек. Затем вы извлекаете сообщение внутри действия, в котором вы хотите показать сообщение, а затем назначаете его представлению, как я делаю в successAction. Имейте в виду, что вы можете передать любой $ var или массив данных, назначив его в контроллере, например: $ this-> view-> var = $ var; В представлении, которое затем будет доступно как $ this-> var.

Поскольку вы спросили о входе в систему, я покажу вам, как я обычно это делаю. Не то, чтобы это было наилучшим образом.

Мой индекс LoginController имеет форму:

  public function indexAction() { $form = new Zfcms_Form_Login; $this->view->form = $form; /*check for valid input authenticate using adapter persist user record to session redirect to original request URL if present*/ if ($this->getRequest()->isPost()) { if ($form->isValid($this->getRequest()->getPost())) { $values = $form->getValues(); $authAdapter = $this->getAuthAdapter(); # get the username and password from the form $username = $values['username']; $password = $values['password']; # pass to the adapter the submitted username and password $authAdapter->setIdentity($username) ->setCredential($password); $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); if ($result->isValid()) { # all info about this user from the login table # ommit only the password, we don't need that $userInfo = $authAdapter->getResultRowObject(null, 'password'); # the default storage is a session with namespace Zend_Auth $authStorage = $auth->getStorage(); $authStorage->write($userInfo); $session = new Zend_Session_Namespace('zfcms.auth'); if (isset($session->requestURL)) { $url = $session->requestURL; unset($session->requestURL); $this->_redirect($url); } else { $this->_helper->getHelper('FlashMessenger') ->addMessage('You were successfully logged in as ' . $userInfo->username); $this->_redirect('/login/success'); } } else { $this->view->message = 'You could not be logged in. Please try again.'; } } } } с  public function indexAction() { $form = new Zfcms_Form_Login; $this->view->form = $form; /*check for valid input authenticate using adapter persist user record to session redirect to original request URL if present*/ if ($this->getRequest()->isPost()) { if ($form->isValid($this->getRequest()->getPost())) { $values = $form->getValues(); $authAdapter = $this->getAuthAdapter(); # get the username and password from the form $username = $values['username']; $password = $values['password']; # pass to the adapter the submitted username and password $authAdapter->setIdentity($username) ->setCredential($password); $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); if ($result->isValid()) { # all info about this user from the login table # ommit only the password, we don't need that $userInfo = $authAdapter->getResultRowObject(null, 'password'); # the default storage is a session with namespace Zend_Auth $authStorage = $auth->getStorage(); $authStorage->write($userInfo); $session = new Zend_Session_Namespace('zfcms.auth'); if (isset($session->requestURL)) { $url = $session->requestURL; unset($session->requestURL); $this->_redirect($url); } else { $this->_helper->getHelper('FlashMessenger') ->addMessage('You were successfully logged in as ' . $userInfo->username); $this->_redirect('/login/success'); } } else { $this->view->message = 'You could not be logged in. Please try again.'; } } } } 

В действии успеха мы делаем это:

 public function successAction() { if ($this->_helper->getHelper('FlashMessenger')->getMessages()) { $this->view->messages = $this->_helper ->getHelper('FlashMessenger') ->getMessages(); } else { $this->_redirect('/login/success'); } } 

В сценарии просмотра мы можем сделать что-то вроде того, что у меня есть. Причина, по которой я делаю это, заключается в том, что иногда я пропускаю только одно сообщение в контроллере, в этом случае я просто использую:

 $this->view->message = 'message goes here'; 

Затем поймайте их обоих, если они установлены в представлении:

 <?php if(isset($this->message) || isset($this->messages)): ?> <?php if(is_array($this->messages)) { echo implode($this->messages); } else { echo $this->message; }?> <?php endif ?>