-1

このシナリオで(Zend Frameworkを使用して)リクエスト間でデータを永続化するための最良の方法をよりよく理解しようとしています。

イベントコントローラがあり、デフォルト(インデックス)ビューに既存のアナウンス(存在する場合)と、新しいアナウンスを追加するためのリンクが表示されているとします(イベントとアナウンスはどちらも任意のオブジェクトです)。eventIdを取得しようとしているので、データベースに保存するときに新しいアナウンスを関連付けることができます。構成上、イベントは0から多数のアナウンスで構成されます。Zend Frameworkについての私の限られた理解から、2つの主要なオプションがわかります。

オプション1:URLを「/ event / addAnnouncement / eventId / 5」のようにします。これにより、ルート/パスパラメーターを介してeventIdを簡単に取得できます。

オプション2:コントローラーのindexActionで、eventIdをセッション変数に保存します。セッション変数は、イベントコントローラーのaddAnnouncementActionで取得できます。このように、[アナウンスの追加]リンクは単に'/ event /addAnnouncement/'になります。

誰かがこれらの2つの方法のどちらが優れているか、または私が知らない別の方法があるかどうかに光を当てることができますか?

いつものように、どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

2

自問する質問は、データをどのくらいの期間保持する必要があるかということです。POSTまたはGET
を使用できる次のアクションにデータを渡すためにデータを保存するだけでよい場合、GETはURLを通過し、POSTは通過しません(通常)。

あなたが提示した例は、データを検証、フィルタリング、処理するのに十分な時間だけデータを永続化する必要があることを示唆しています。したがって、いくつかのデータをパラメーター( POSTまたはGET )として渡すことに非常に満足する可能性があります。これにより、必要な一時的な永続性が提供され、変数を渡さなかった要求が行われるとすぐに期限切れになるデータの追加の利点も提供されます。

簡単な例(フォームが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には、パラメータを渡すこととセッションにデータを格納することの間にある種類のオプションがもう1つあります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_NamespaceZend_Registry

于 2012-05-05T08:22:07.960 に答える
1

オプション1の方が優れていますが、この例ではこれはPOSTではありません(ただし、POSTを使用して実行できます)。

オプション2の問題は次のとおりです。

  • さまざまなイベントに関連して、ユーザーが同時に複数のウィンドウまたはタブを開いている場合、どのイベントIDを使用する必要があるかをどのように追跡しますか?
  • ユーザーがイベントの追加ページをブックマークして後で戻ってきた場合、セッション変数が設定されていない可能性があります

オプション2は、実装が少し複雑であり、セッションへの依存を追加します。

于 2012-05-04T21:25:30.230 に答える