我正在编写一个应该与不同的用户定义实体一起使用的包。我希望此捆绑包能够访问该实体中用户提供的字段。
是否有一种类似于$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);
// ...
}
答案 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;