Есть ли способ установить и получить значения из многомерного массива через встроенный обработчик сеансов Kohana? - PullRequest
2 голосов
/ 16 октября 2010

В PHP я часто делаю следующее:

$_SESSION['var']['foo'] = array('bar1' => 1, 'bar2' => 2);
// ...
$_SESSION['var']['foo']['bar2'] = 3;
// ...
echo $_SESSION['var']['foo']['bar2']; // 3

Мне интересно, каков рекомендуемый способ хранения многомерных массивов в сеансе с Коханой.

Я знаю, что могу сделать следующее, но я не знаю, как заставить его работать с многомерным, особенно с частью get:

Session::instance()->set('var', array(
 'foo' => array(
  'bar1' => 1,
  'bar2' => 2,
 ),
));
// ...
// how do I set just bar2?
// ...
// this gets the whole array, but how do I get just bar2? 
Session::instance()->get('var');

Итак, вопросы:

  1. Как мне установить просто bar2?
  2. Как мне получить просто bar2?

Есть ли способ сделать что-либо из этого в Кохане 3?

Я бы хотел использовать собственные сеансы, но мы пытаемся использовать сеансы базы данных.

Ответы [ 2 ]

4 голосов
/ 16 октября 2010

Короткий ответ: нет способа сделать это, учитывая текущую реализацию сессий Кохана.У вас есть две альтернативы:

Либо получите и установите весь массив, каждый раз редактируя нужные биты:

$array = Session::instance()->get('var');
$array['foo']['bar2'] = 'baz';
Session::instance()->set('var', $array);

Или переопределяйте Kohana_Session-> get () и -> set() методы (которые определены здесь на github ).Имейте в виду, что, учитывая замечательную «многоуровневую» файловую систему в Kohana, вы действительно можете расширить класс, изменив только нужный метод, не редактируя основной код Kohana.1010 * параметр, чтобы принимать либо строки, либо массивы.Если вы передаете массив, он должен интерпретировать каждый элемент массива как «более глубокий» уровень.

$key = array('var', 'foo', 'bar2');
Session::instance()->get($key, $default);
Session::instance()->set($key, 'baz');
3 голосов
/ 17 октября 2010
$session = & Session::instance()->as_array();
$session['foo']['bar2'] = 'baz';

UPD.Также вы можете использовать Arr::path():

$bar2 = arr::path(Session::instance()->as_array(), 'foo.bar2');// returns 'baz'
$bars = arr::path(Session::instance()->as_array(), '*.bar2');  // returns array of bar2's
...