tags:

views:

35

answers:

1

Imagine a User model like this:

class User {
  /**
   * ...some mapping info...
   */
  private $username;

  /**
   * ...some mapping info...
   */  
  private $password;

  public function setUsername($username) {
    $this->username = $username;
  }

  public function setPassword($password) {
    $this->password = $password;
  }
}

A sample form to submit a new User:

<form action="/controller/saveUser" method="post"> 
  <p>Username: <input type="text" name="username" /></p>
  <p>Password: <input type="text" name="password" /></p>  
</form> 

Currently in my controller I save a new User like this:

public function saveUser() {
  $user = new User();
  $user->setUsername($_POST['username']);
  $user->setPassword($_POST['password']);

  $entityManager->persist($user);
}

That means, calling the setter method for each of the properties I receive via the form.

My question: is there a method in Doctrine which allows you to automatically map form data/an array structure to a Doctrine model? Ideally it is possible to populate nested object graphs from an array with a similiar structure.

Ideally I could change my controller code to something along these lines (pseudo code/example):

public function saveUser() {
  $user = Doctrine::populateModelFromArray('User', $_POST); // does this method exist?
  $entityManager->persist($user);  
}

Thanks in advance for any hints!


EDIT: It seems something like this exists in Doctrine 1 ( http://www.doctrine-project.org/projects/orm/1.2/docs/manual/working-with-models%3Aarrays-and-objects%3Afrom-array/en ) - so, is there an equivalent in Doctrine 2?

A: 

If you name your fields the same as the entity properties:

<?php
foreach($_POST as $field => $val){
  $object->$field = $val;
}
?>

But that only works for public properties. However, you could calculate the method name based on this, and use call_user_func() to call it.

Harold1983-