【问题标题】:Write values to before created object with PropertyAccesor使用 PropertyAccesor 将值写入之前创建的对象
【发布时间】: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 包含SerialNoFirmwareBuyDate 列。
  • ProductisActivePrice

现在我想通过 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'
        ),
    )
)

所以为了对每个表使用相同的类(例如HardwareProduct),我尝试这样做:

$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() 导致此失败的实际值是多少?
  • 编辑了问题

标签: php symfony accessor


【解决方案1】:

您混淆了isWritable()setValue() 的参数。如果您像这样交换它们,您的代码将按预期工作:

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

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

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 2013-06-16
    • 1970-01-01
    • 2019-11-04
    • 2016-02-05
    • 2018-04-18
    • 1970-01-01
    • 2014-10-31
    • 2016-06-04
    相关资源
    最近更新 更多