Записать значения в ранее созданный объект с помощью PropertyAccesor

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

Сбой здесь: Предупреждение: недопустимый тип смещения в isset или пустой

Ошибка выдается здесь:

try{
$accessor->isWritable($field['name'], $hw);
}catch (\Exception $exception){
throw new \Exception('Fails Here: '.$exception->getMessage());
}

отказ

Я знаю, что это опасно и может причинить вред из-за инъекции, но это внутренний проект, в котором я только пользователь, и в настоящее время я не могу придумать более элегантный способ сделать это, не написав add_new_row или аналогичная функция для каждой таблицы.

пример

  • Стол Hardware имеет столбцы SerialNo, Firmware а также BuyDate,
  • Стол Product имеет столбцы isActive а также Price

Через ajax теперь я хочу отправить массив для каждой из таблиц, чтобы создать новую запись. Я получаю массив, как это через $.post():

$data = array(
'table' => 'Hardware',
'values' => array(
0 => array(
'name' => 'SerialNo',
'value' => '1234'
),
1 => array(
'name' => 'Firmware',
'value' => 'v1.04'
),
2 => array(
'name' => 'BuyDate',
'value' => '2018-08-23'
),
)
)

Таким образом, чтобы использовать один и тот же класс для каждой таблицы (Hardware а также Product например) Я пытался сделать это:

$accessor = PropertyAccess::createPropertyAccessor();

if($data['table'] === 'Hardware'){
$obj = new Hardware();
}else{
$obj = new Product();
}

foreach ($data['values'] as $field) {

try{
$accessor->isWritable($field['name'], $hw);
}catch (\Exception $exception){
throw new \Exception('Fails Here: '.$exception->getMessage());
}

if (!$accessor->isWritable($field['name'], $obj)) {
throw new InvalidArgumentException('Could not write: ' . $field['name']);
}

$accessor->setValue($field['name'], $obj, $field['value']);
$em->persist($obj);
}

Это даже не исключение, и я думаю, что это потому, что $obj выглядит так (это то, что означает выброшенная ошибка, не так ли?)

Hardware {#2708 ▼
-id: null
-serialNo: null
-firmware: null
-buyDate: null

Есть ли способ сделать это так, как я этого хотел?

1

Решение

Вы путаете параметры для isWritable() а также setValue(), Если вы поменяете их местами так, ваш код будет работать так, как ожидается:

if (!$accessor->isWritable($obj, $field['name'])) {
throw new InvalidArgumentException('Could not write: ' . $field['name']);
}

$accessor->setValue($obj, $field['name'], $field['value']);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector