-1

我试图更好地理解在这种情况下(使用 Zend 框架)在请求之间保存数据的最佳方法是什么:

假设我有一个事件控制器,默认(索引)视图显示任何现有的公告(如果有的话),以及添加新公告的链接(事件和公告都是任意对象)。我正在尝试检索 eventId,以便在将新公告保存到数据库时将其与它相关联。从组成上讲,一个事件由 0 到多个公告组成。根据我对 Zend 框架的有限理解,我看到了两个主要选项。

选项一:使 URL 类似于“/event/addAnnouncement/eventId/5”,这样可以通过路由/路径参数轻松检索 eventId。

方案二:在控制器的 indexAction 中,将 eventId 保存到会话变量中,然后可以在 Event 控制器的 addAnnouncementAction 中检索。这样,Add Announcement 链接将只是“/event/addAnnouncement/”。

谁能阐明这两种方式中哪一种更好,或者是否还有另一种我不知道的方式?

与往常一样,非常感谢任何帮助。谢谢。

4

2 回答 2

2

要问自己的问题是,您需要将数据保留多长时间?
如果您只需要保存数据以将其传递给可以使用POSTGET的下一个操作,则GET将通过 url 而POST不会(通常)。

您提供的示例表明您需要将数据保留足够长的时间以验证、过滤和处理数据。因此,您可能会非常满意将少量数据作为参数(POSTGET)传递。这将提供您需要的临时持久性,并提供额外的好处,即一旦发出未传递变量的请求,数据就会过期。

一个简单的示例(假设您的表单使用POST方法传递数据):

   if ($this->getRequest()->isPost()) {
        if ($form->isValid($this->getRequest()->getPost()){
            $data = $form->getValues();//filtered values from form
            $model = new Appliction_Model_DbTable_MyTable();
            $model->save($data);
            //but you need to pass the users name from the form to another action
            //there are many tools in ZF to do this with, this is just one example
            return $this->getHelper('Redirector')->gotoSimple(
                                                   'action' => 'newaction', 
                                                    array('name' => $data['name'])//passed data
                                                   ); 
        }

}

如果您需要将数据保存更长时间,那么$_SESSION可能会派上用场。在 ZF 中,您通常会使用它Zend_Session_Namespace()来操作会话数据。
它很容易使用Zend_Session_Namespace,这里是我经常使用它的一个例子。

class IndexController extends Zend_Controller_Action {
protected $_session;

public function init() {
    //assign the session to the property and give the namespace a name.
    $this->_session = new Zend_Session_Namespace('User');
}
public function indexAction() {
    //using the previous example
    $form = new Application_Form_MyForm();

     if ($this->getRequest()->isPost()) {
        if ($form->isValid($this->getRequest()->getPost()){
            $data = $form->getValues();//filtered values from form
            //this time we'll add the data to the session
            $this->_session->userName = $data['user'];//assign a string to the session
            //we can also assign all of the form data to one session variable as an array or object
            $this->_session->formData = $data;
            return $this->getHelper('Redirector')->gotoSimple('action'=>'next');
        }
    }
    $this->view->form = $form;
}
public function nextAction() {
   //retrieve session variables and assign them to the view for demonstration
   $this->view->userData = $this->_session->formData;//an array of values from previous actions form
   $this->view->userName = $this->_session->userName;//a string value
    }
  }
}

您需要保留在应用程序中的任何数据都可以发送到任何操作、控制器或模块。请记住,如果您重新提交该表单,保存到这些特定会话变量的信息将被覆盖。

ZF 中还有一个选项,介于传递参数和在会话中存储数据之间,Zend_Registry. 它的用途非常类似于Zend_Session_Namespace并且经常用于在引导程序中保存配置数据(但几乎可以存储您需要存储的任何内容),并且还被许多 Zend 内部类使用,其中最著名的是flashmessenger 动作助手

 //Bootstrap.php
 protected function _initRegistry() {

        //make application.ini configuration available in registry
        $config = new Zend_Config($this->getOptions());
        //set data in registry
        Zend_Registry::set('config', $config);
    }
 protected function _initView() {
        //Initialize view
        $view = new Zend_View();
        //get data from registry
        $view->doctype(Zend_Registry::get('config')->resources->view->doctype);
        //...truncated...
        //Return it, so that it can be stored by the bootstrap
        return $view;
    }

我希望这有帮助。如果您有更多问题,请查看这些链接:

ZF 请求对象
Zend_Session_Namespace
Zend_Registry

于 2012-05-05T08:22:07.960 回答
1

选项 1 更好,尽管在您的示例中这不是 POST(但可以通过 POST 完成)。

选项 2 的问题是:

  • 如果用户同时打开多个与不同事件相关的窗口或选项卡,您将如何跟踪应该使用哪个事件 ID?
  • 如果用户将添加事件页面添加为书签并稍后返回,则可能未设置会话变量

选项 2 实现起来也稍微复杂一些,并且增加了对会话的依赖。

于 2012-05-04T21:25:30.230 回答