2010-09-05 59 views
3

我新的學說2(和PHP中的例外,真的)例外,但我想拿出與學說2強大的驗證引擎(對CodeIgniter的頂部),之後this page如何處理的學說2驗證

現在我想知道在那裏我會定義ValidateException類,以及如何「嘗試」做一個保存在我的實體(堅持?)(從控制器,圖書館等)。

我想有一些地方,這樣做(在「認證」庫,例如)之後:

$user->username = $username; 
$user->email_address = $email_address; 
$user->password = $password; 

$em->persist($user); 
$em->flush(); 

return $foo; //where $foo refers to whether $em->flush() worked... 

我可以簡單地返回持久性是否成功(即,通過驗證和保存)或不成功(即驗證失敗)。

回答

4

我想你可能想看看有用戶廠。您可以擁有一些方法(從表單的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 
    } 
}