代码之家  ›  专栏  ›  技术社区  ›  Naveed

Zend:重定向到带参数的操作

  •  32
  • Naveed  · 技术社区  · 15 年前

    我正在使用Zend框架。我正在使用以下语句重定向到另一个操作。

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

    上面的语句工作得很好,调用了“some_action”。现在我想把一些参数传递给这样的“一些动作”。

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

    以及如何在调用的操作中获取参数。通常我们这样做:

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

    如何执行此操作?示例代码。谢谢

    5 回复  |  直到 11 年前
        1
  •  29
  •   Victor Smirnov    11 年前

    使用 Zend_Controller_Action::redirect() 方法(只传递到sarfraz的helper方法)

    $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()接受第二个可选参数,如果找不到该参数,则将该参数设置为该变量的默认值。

        2
  •  50
  •   armandfp    14 年前

    您可以尝试使用重定向程序:

    $params = array('user' => $user, 'mail' => $mail);
    $this->_helper->redirector($action, $controller, $module, $params);
    
        3
  •  6
  •   Sarfraz    15 年前

    您可以尝试以下操作:

      $this->_redirector->gotoUrl('/my-controller/my-action/param1/test/param2/test2');
    
        4
  •  4
  •   mschr    12 年前

    您还可以为userid添加$params say like

    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.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
    

        5
  •  1
  •   Bo Persson tox    13 年前

    你如何得到参数排序取决于你在哪里,

    您不必捕获$param请求来实现您在这里要做的事情。您正在使用FlashMessenger帮助程序向堆栈添加消息。然后在要显示消息的操作中检索消息,然后像我在成功消息操作中那样将其分配给视图。请记住,通过在控制器中分配$this->视图->var=$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 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 
    ?>