【发布时间】:2018-08-23 08:48:40
【问题描述】:
我有一个类,它接收带有我的数据库字段名称和相应值的字符串。我想创建一个新条目,并想事先检查该字段是否存在于我的数据库中。 但是,由于该对象是在我检查属性是否可读之前创建的,因此会引发异常:
此处失败:警告:isset 中的偏移类型非法或为空
这里抛出错误:
try{
$accessor->isWritable($field['name'], $hw);
}catch (\Exception $exception){
throw new \Exception('Fails Here: '.$exception->getMessage());
}
免责声明
我知道这很危险,并且可能会因注射而造成伤害,但这是一个只有我作为用户的内部项目,我目前想不出更优雅的方法来做到这一点,除非写 @987654322 @ 或每个表的类似函数。
示例
- 表
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
有什么方法可以按照我想要的方式做到这一点吗?
【问题讨论】:
-
这个错误在哪里抛出?你有堆栈跟踪吗?传递给
isset()或empty()导致此失败的实际值是多少? -
编辑了问题