I’ve been suggested to use Mappers to separate object storage in db from real object behaviour, which sounds like a nice idea. But being used to other OOP languages like Java or SmallTalk, I always try to encapsulate my objects the most I can.
I’ve read several mappers examples and some of them access the variables of the domain object directly (which would be my last choice, though I know it’s more comfortable).
The only solution I currently come up with is something like:
class User{
public __construct($mapped_data){
foreach($data as $key=>$value){
$this->$key=$value;
}
...
}
class UserMapper{
private populate($user,$db_data){
...
$map=array('id'=>'id','psw'=>'password','mail'=>'email', ...);
foreach($db_data as $key=>$value){
$mapped_data[$map[$key]]=$value;
}
return new User($mapped_data);
}
}
The map is because the class User doesn’t have to know the db column names at all.
Is this approach correct? Is there a better one?
Thanks
I would suggest that Data Access Objects are a more appropriate pattern for what you want to achieve. The Mapper that you show above just increases the complexity but doesn’t really provide much in the way of benefits.
In terms of getters and setters, you can use some of PHP’s magic methods to clean up the code above. The following allows you to store your data in a protected array while providing access to it that looks like it’s just via the object property, but is actually through a method (so that you can provide your own logic there; make things read only, or hide some, etc).
You can then access the data like
You might also simplify this all for yourself by using an existing PHP ORM library.