2

この投稿を開始したのは、ユーザー セッション (Symfony 1.4) から値を取得/設定する方法を知るためです。Get は完全に機能しますが、Set は機能しません。グローバル セッション ($_SESSION) は更新されているが、ユーザー セッションは更新されていないことを Debug Modus で確認できます。私はこの方法この方法別の方法、少なくともこれを試しました...成功しませんでした。Symfony 1.4 のそのようなバグについて読んだことはありません。私はブラウザ(Linux)としてFirefoxとChromeを使用しています(匿名タブでもテストしました)。

Modus User のデバッグは次のようになります。

attributeHolder:
myNS: { 
     aValue: '15', 
     ns_15: { 
         Tel: '78568951', 
         myID: '15', 
         anotherID: '120', 
         anArray: [{ 
             arrayID: '78', 
             Company: 'myComp'
         }] }, 
     ns_17: { ... } 
}

aValue属性を変更し、削除して再挿入できます。しかし、ns_15またはns_17は削除または変更できますが、この変更は (symfony Debug Mode) Userに影響を与えることはできませんが、$_SESSION (symfony Debug Modus Globals )入るだけで、更新された値を確認できます。

symfony 1.4 でユーザーセッションに値を設定/変更/削除または書き込む別の方法はありますか?それとも Symfony のバグですか?

編集1

このバグとこのブログを見るまで、私はそれを理解していません!! さて、私はAJAXを使用してコントローラーを呼び出しています。それが、Session に書き込めない理由かもしれません。もう 1 つの方法は、実際には sfWebResponse をサブクラス化できないため、アクションが既に sfActions をサブクラス化しているためです。:(

EDIT2

Edit1がこれを作ろうとしたので:

  $sessionData = $this->getUser()->getAttribute("ns_15", array(), "myNS");//all good
  $sessionData["Tel"] = "0111111110";
  var_dump($sessionData["Tel"]);//show me 0111111110
  $this->getUser()->setAttribute("ns_15", $sessionData, "myNS");
  $this->getUser()->shutdown();
  sfContext::getInstance()->getStorage()->shutdown();

2 回リロードする動作は解決されましたが、まだ $_SESSION と USER SESSION に書き込めません。(同じトラブルも)。

4

1 に答える 1

0

$_SESSIONユーザー属性を操作する方法を要約しようとします (これは、グローバルを変更することと同じではないことに注意してください。理由については、こちらのコメントを参照してください)。

// set a singe value in a namespace
$this->getUser()->setAttribute('aValue', 15, 'myNS');
// set an array in a namespace
$this->getUser()->setAttribute('ns_15', array('Tel' => '78568951', 'myID' => '15', 'anotherID' => '120', 'anArray' => array(array('arrayID' => '78', 'Company' => 'myComp'))), 'myNS');

// get the array from a namespace
$attributes = $this->getUser()->getAttribute('ns_15', array(), 'myNS');
// modify some value in the array
$attributes['Tel'] = '12345';
// remove some value from the array
unset($attributes['myID']);
// ... and save your changes back
$this->getUser()->setAttribute('ns_15', $attributes, 'myNS');
// remove the whole array from the namespase
$this->getUser()->getAttributeHolder()->remove('ns_15', null, 'myNS');
// remove the whole namespace
$this->getUser()->getAttributeHolder()->removeNamespace('myNS');

名前空間全体にもアクセスできます。

// get all attributes from a namespace
$allAttributes = $this->getUser()->getAttributeHolder()->getAll('myNS');
// manipulate the whole namespace here...
// ...and save your changes back
$this->getUser()->getAttributeHolder()->add($allAttributes, 'myNS');

同じ名前空間で作業していて、名前空間パラメーターを省略したい場合:

$originalDefaultNs = $this->getUser()->getAttributeHolder()->getDefaultNamespace();
$this->getUser()->getAttributeHolder()->setDefaultNamespace('myNS', false);
// ...
$attributes = $this->getUser()->getAttribute('ns_15', array());
// ...
// don't forget to set back the original ns
$this->getUser()->getAttributeHolder()->setDefaultNamespace($originalDefaultNS, false);

本当に冗長であることはわかっていますが、symfony でそれを行う方法は他にないと思います。クラスを略奪して、sfNamespacedParameterHolderこれらの機能がどのように機能するかを確認できます。

于 2012-08-10T10:39:54.320 に答える