У меня есть следующее определение класса:Как сохранить 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.
У вас нет. Приклеивание объекта в сеанс сериализует его в текстовом формате, а затем десериализует его, когда вы хотите работать с ним. Невозможно сохранить объект живым, потому что это противоречит дизайну PHP. Как и во всем, есть * способы сделать это, но вопрос в том, что вы решаете? Это явная проблема XY, и без причины, почему вы после этого воспринимаемого решения - нет никакой возможности предложить правильную помощь. –
@ N.B. читайте снова обновленный OP, где говорится: «Почему?», вот что я пытаюсь понять. – ReynierPM
Это не почему. Это потому что. Что поможет вам объект, который хранится в памяти? Там ** ** есть причина, по которой вы считаете, что что-то из памяти, которая сохраняется через запрос, решает что-то, с чем вы сталкиваетесь. Есть причины, по которым PHP не ведет себя так (имеются крайние случаи), и должна быть веская причина, по которой вы хотите принудить ее к этому. Что не так с сохранением необходимых данных, чтобы вы могли создать свой объект по мере необходимости? –