2017-10-17 94 views
0

我有一個實體學生,其中有分配的主題。不幸的是,這些映射是奇怪的,我現在不允許改變它,但是作業知道它們屬於哪個主題,主題知道它們屬於哪個學生,而不是相反。學生不知道它的主題,它的主題不知道它的任務。更多我有onDelete = CASCADE「,所以默認情況下,學生將被刪除與他的科目與他的任務。這工作正常。使用preRemove刪除entiry之前執行檢查

我想創建一個檢查,如果學生有一個主題,學生不能刪除,也沒有問題。

如果沒有開放的問題,我想刪除的學生,主題和任務。

我如何執行呢?我想,我已經有一個這樣的骨幹;

public function preRemove(LifecycleEventArgs $args) 
    { 
     $em = $args->getEntityManager(); 
     $student = $args->getEntity(); 

     if ($student instanceof Student) { 
      $subjects = $em->getRepository(Subject::class)->findBy(['student' => $student]); 

      foreach ($subjects as $subject) { 
       if ($subject instanceof Subject) { 
        $assignments = $em->getRepository(Assignment::class)->findBy(['subject' => $subjects]); 

        foreach ($assignments as $assignment) { 
         if ($assignment->isCompleted()) { 
          echo $assignment." - CAN DELETE<br>"; 
         } else { 
          echo $assignment." - CAN'T DELETE, THERE ARE OPEN ASSIGNMENTS!<br>"; 
         } 
        } 
       } 
      } 
     } 
    } 

什麼將現在正確的方式去?只需返回true或false來停止或繼續操作?或者我需要再次執行特定的學說,比如刪除等。我不是100%確定下一步該做什麼。

如果分配不能被刪除,我還需要創建自定義異常。

任何人都可以請幫忙嗎?我會很感激。

回答

0

我更喜歡創建一個服務,並在每次需要檢查這種操作時使用它。可悲的教義事件和聽衆太複雜,並且在很長一段時間內會帶來更多有益的問題。當然,如果你是「手動」的,你必須確保每次都將這個控制委託給該服務,並且不要手動刪除這些對象。此外,使用服務可以使您的代碼更少地耦合到ORM本身。

通過看你的代碼有沒有「銀彈回答」這個,但我寧願一個Exception(自定義類型),可逮住你需要知道,一些錯誤已經發生的方式

相關問題