我可以通过提供字段名称来设置实体中的字段值吗?
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');
}
我正在编写一个应该与不同的用户定义实体一起使用的包。我希望这个包能够访问该实体中用户提供的字段。
有没有类似$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');
}