我可以通过提供字段名称在实体中设置字段值吗?

时间:2015-05-16 16:56:53

标签: symfony reflection entity

我正在编写一个应该与不同的用户定义实体一起使用的包。我希望此捆绑包能够访问该实体中用户提供的字段。

是否有一种类似于$entity->set('field', 'value')的方法?我是否必须使用反射从头开始?

我已经提出了什么:

在控制器中:

public function editAction(Request $request) {
  $content = $request->request->get('content'); // Example: "John Doe"
  $entity = $request->request->get('entity'); // Example: "SomeBundle:SomeEntity"
  $field = $request->request->get('field'); // Example: "name"
  $id = $request->request->get('id'); // Example: "42"

  $em = $this->getDoctrine()->getManager();
  $element = $em->getRepository($entity)->find($id); // Entity with id 42

  // How can I write this line?:
  $element->set($field, $content); //Alias for $element->setName($content);
  // ...
}

2 个答案:

答案 0 :(得分:2)

您可以使用Property Accessor组件来执行此操作。您只需提供对象,字段名称和设置值,组件将处理其余部分(公共属性,_set或setter)。

use Symfony\Component\PropertyAccess\PropertyAccess;

// ...

$value = $request->get('value');
$em = $this->getDoctrine()->getManager();
$element = $em->getRepository($entity)->find($id); // Entity with id 42

$accessor = PropertyAccess::createPropertyAccessor();

if ($accessor->isWritable($element, 'fieldName')) {
    $accessor->setValue($element, 'fieldName', $value);
} else {
    throw new \Exception('fieldName is not writable');
}

答案 1 :(得分:1)

您必须在实体中实施此方法。例如。 :

class YourEntity
{
   public function set($field, $value)
   {
      $this->{'set'.$field}($value);
   }
}

或者您可以将属性设置为公开,然后执行:

$element->$field = $content;