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

Can I set a field value in an Entity by providing the field name?

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

有没有类似$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);
  // ...
}

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

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

或者您可以将属性设置为 public 并执行:

$element->$field = $content;

您可以使用 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');
}