4

У меня есть следующее определение класса:Как сохранить PHP объект живой (или в памяти) между AJAX вызывает

class DatasegmentationController 
{ 
    public function indexAction() 
    { 
     $options['permissions'] = array(
      'canDelete'  => false, 
      'canEdit'  => false 
     ); 

     if ($this->getRequest()->isXmlHttpRequest()) { 
      $table = $this->getRequest()->getParam('table'); 

      if ($table !== '' && $table !== null) { 
       $utilStr = new UtilString(); 

       // This is a patch because class and tables names does not match 
       // so far it only happens with company and this is only for 
       // instantiate the proper class dynamically 
       $param_table = $table; 
       $table  = $table === 'companies' ? 'company' : $table; 
       $classObj = strpos($table, '_') !== false ? $utilStr->stringToCamelCase($table, '_') : $utilStr->stringToCamelCase($table); 
       $className = new $classObj(); 

       $module_map = $field_map[$param_table]; 

       /** @var $module_map array */ 
       $fields = []; 
       foreach ($module_map as $key => $value) { 
        $fields[] = [ 
         'id' => $key, 
         'text' => $key 
        ]; 
       } 

       $conditions  = json_decode($this->_request->getParam('conditions'), true); 
       $dynDataGridName = "DataSegmentation{$this->classObj}Grid"; 
       $dynMethodName = "get{$this->classObj}GridModel"; 

       $gridObj = new $dynDataGridName(
        $this->className->$dynMethodName($conditions), 
        $this->view->users_id, 
        "{$table}_list", 
        "{$table}.{$table}_id", 
        '/datasegmentation/index', 
        'editor', 
        $options 
       ); 

       return $this->_helper->json([ 
        'fields' => $fields, 
        'grid' => $gridObj->getGridJs() 
       ]); 
      } 

      if (isset($classObj, $className, $gridObj)) { 
       $page = $this->_request->getParam('page', 1); 
       $limit = $this->_request->getParam('rows', 20); 
       $col = $this->_request->getParam('sidx', 1); 
       $order = $this->_request->getParam('sord', 0); 
       $search = $this->_request->getParam('val', null); 

       echo $gridObj->getData($page, $limit, $col, $order, $search); 
      } 
     } 
    } 
} 

Что выше код делает следующее:

  • URL-адрес http://localhost/datasegmentation является
  • Вид отображает элемент выбора (modules) с опциями
  • При изменении select#modules Я отправил его как часть URL-адрес, поэтому следующий AJAX вызов становится: http://localhost/datasegmentation?table=companies (например)
  • indexAction() функция затем выполнить то, что на условную когда $table не пусто или не равно нулю
  • Среди всех этих вещей он пытается создать все динамически как вы можете заметить в коде.
  • Один из этих вещи является динамичной сеткой ($gridObj), который имеет вызов AJAX для одних и тех же indexAction(), но без параметров для заполнения данных после того, как визуализируются
  • После сетка визуализируются на виде, что делает AJAX вызов и снова вызывается indexAction(), и он пропускает условное значение для таблицы, потому что параметр не задан и пытается выполнить второе условие, но неожиданно он терпит неудачу, потому что объекты, которые должны работать в коде, исчезли.

Имея этот сценарий мои вопросы:

  • Как сохранить объект alives между AJAX звонки? Хранение в сеансе var? Любое другое обходное решение?
  • Если ответ хранится в сеансе var, рекомендуется ли это? А как насчет ответов на вопросы this, this и this?
  • Как вы справитесь?

Проблема

  • Второй AJAX вызов является один добавление данных к сетке, и она опирается на динамические параметры. Это то, что мне нужно решить, чтобы это работало.

Я не знаю, действительно ли это полезно, но это тестируется и разрабатывается поверх проекта Zend Framework 1 с использованием PHP 5.5.x.

+2

У вас нет. Приклеивание объекта в сеанс сериализует его в текстовом формате, а затем десериализует его, когда вы хотите работать с ним. Невозможно сохранить объект живым, потому что это противоречит дизайну PHP. Как и во всем, есть * способы сделать это, но вопрос в том, что вы решаете? Это явная проблема XY, и без причины, почему вы после этого воспринимаемого решения - нет никакой возможности предложить правильную помощь. –

+0

@ N.B. читайте снова обновленный OP, где говорится: «Почему?», вот что я пытаюсь понять. – ReynierPM

+0

Это не почему. Это потому что. Что поможет вам объект, который хранится в памяти? Там ** ** есть причина, по которой вы считаете, что что-то из памяти, которая сохраняется через запрос, решает что-то, с чем вы сталкиваетесь. Есть причины, по которым PHP не ведет себя так (имеются крайние случаи), и должна быть веская причина, по которой вы хотите принудить ее к этому. Что не так с сохранением необходимых данных, чтобы вы могли создать свой объект по мере необходимости? –

ответ

2

Как сохранить алименты объектов между вызовами AJAX? Хранение в сеансе var? Любое другое обходное решение?

Сохранение данных в сессионный вар Сохранение данных в файле, с идентификатором клиента (может быть логин, случайный, IP и т.д.) Сохранение данных в базе данных.

Если ответ хранится в сеансе var, рекомендуется ли это? А как насчет ответов на это, это и это среди других?

Если вы храните критически важные данные, используйте шифрование до конца, SSL, HTTPS.

Как вы справитесь?

Использование переменных сеанса.