我可以通过提供字段名设置实体的字段值?(Can I set a field value in an

2019-09-29 16:54发布

我写的是应该有不同的用户定义的实体使用的包。 我想这束能够访问该实体用户提供现场。

是否有看起来像一个方法$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);
  // ...
}

Answer 1:

您可以使用属性访问器组件,它可以让你完成这一点。 您只需提供您的对象,字段名,并把它的值设置为与该组件将处理其余部分(耻骨性质,_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');
}


Answer 2:

你必须实现在实体此方法。 例如:

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

或者,你可以设置你的属性为公共的和做的事:

$element->$field = $content;


文章来源: Can I set a field value in an Entity by providing the field name?