我想你可能想看看有用戶廠。您可以擁有一些方法(從表單的POST)獲取數據數組並返回一個User對象。這使您可以封裝創建新的用戶對象的整個過程,以便在您的應用程序中使用(並保留到您的數據存儲區)。你可以在這個地方做所有的嘗試/捕獲,並且你所有的控制器都會調用這一個功能(代碼並不是分散在你的所有控制器中)。
class UserFactory
{
/** @var Doctrine Entity Manager */
private $_em;
function __construct(EntityManager $em) {
$this->_em = $em;
}
function createUserFromArray($data) {
$user = new User();
$user->setUsername($data['username']);
$user->setEmail($data['email']);
$this->_em->persist($user);
$this->_em->flush(); // Or this could be called from some other place
return $user;
}
}
然後在您的控制器,你要做的就是這樣的事情:
// Get the EntityManger from wherever (registry, session, etc)
$userFactory = new UserFactory($em);
$user = $userFactory->createFromArray($dataFromForm);
兩件事額外的東西。
之一,如果你使用顯式getter和setter你的屬性(用戶名和電子郵件),您可以在這些函數中拋出異常,如果他們不符合標準。
在用戶等級:
function setEmail($email) {
// Do some validations on the email address
if (!is_valid_email($email)) {
throw new Exception('Invalid Email');
}
$this->email = $email;
}
兩個,我覺得這是你真正應該問的問題是關於生命週期回調。您可以在模型/實體類中定義它們。
class User
{
/** @PrePersist @PreUpdate */
function ensureUniqueEmail()
{
// Do your check, else throw exception
}
}