What I'm trying to do is create a domain model with a Plain Old PHP Object. The I'm creating a library which will do all the infrastructure stuff. So one of my models looks like this
class Project {
public $id;
public $name;
public $typeId;
private $type;
public function getType() {
return $this->type;
}
public function setType(Type $type) {
$this->typeId = $type->id;
$this->type = $type;
}
}
Now if create a new Project and call setType
with a valid Type object and save the project instance using the ORM both the project and type is saved. But then I load the Project and use getType
method I want the ORM to have modified this method transparently to load the object from persitence. So this method here:
public function getType() {
return $this->type;
}
to be transparently changed into:
public function getType() {
if (is_null($this->type) {
$this->type = $this->adapter->findById('table', $this->typeId);
}
return $this->type; // or return parent::getType();
}
Outlet PHP uses eval to create a Proxy class for Project called Project_Proxy but sometimes there will be subclasses of Project so I am searching for a solution by using Reflection API if there is a way.
I have search google but haven't found anyway to change a method behaviour
Edit: or would it be a good idea to use Outlet PHP's eval method to create Proxy Classes for my models and all subclasses of them?