W tym celu powinno używać się klas abstrakcyjnych z sufiksem Model:
namespace Acme\DemoBunldle\Model;
abstract class UserModel
{
/**
* @return string imię
*/
abstract public function getName();
/**
* @param string $name imię
*
* @return User bieżąca instancja
*/
abstract public function setName($name);
/**
* @return string nazwisko
*/
abstract public function getLastName();
/**
* @param string $lastName nazwisko
*
* @return User bieżąca instancja
*/
abstract public function setLastName($lastName);
/**
* @return string imię i nazwisko
*/
public function getFullName() {
return $this->getName() . " " . $this->getLastName();
}
/**
* @param string $fullName imię i nazwisko
*
* @return User bieżąca instancja
*/
public function setFullName($fullName) {
if (!preg_match('#^[a-Z]+ [a-Z]+$#', $fullName)) { throw new \InvalidArgumentException();
}
list
($firstName, $lastname) = split(" ", $fullName, 1
);
$this->setName($firstName);
$this->setLastName($lastName);
return $this;
}
}
Implementacja:
namespace Acme\DemoBundle\Entity;
use Acme\DemoBunldle\Model\UserModel;
class User extends UserModel
{
// wygenerowane przez Doctrine
}
W kontrolerach oraz serwisach oczywiście wymagamy klasy UserModel i nie obchodzi nas skąd gettery biorą dane

Należy pamiętać, że możemy rozszerzać tylko jedna klasę abstrakcyjną podczas gdy interfejsów można implementować wiele do jednej klasy.