2016-07-30 15 views
1

Ich habe gelernt Laravel io (https://github.com/laravelio/laravel.io/tree/master/app/Forum/Threads) Quellcode zum Erstellen eines Threads in einem Forum. Zuerst kommt die Anfrage an die ForumThreadController. Der Controller ruft ThreadCreator Klasse auf, die für das Erstellen eines Threads verantwortlich ist. Diese Klasse überprüft zunächst den Thread-Betreff und den Nachrichtentext auf Spam. Wenn es Spam ist, wird ein Fehler zurückgegeben, andernfalls wird ein Thread erstellt.Design-Muster in Laravel io Quellcode

interface ThreadCreatorListener 
{ 
     public function threadCreationError(); 
     public function threadCreated(); 
} 

class ForumThreadController implements ThreadCreatorListener 
{ 
     public function __construct(ThreadCreator $threadCreator) 
     { 
      $this->threadCreator = $threadCreator; 
     } 

     public function threadCreationError() 
     { 
      return $this->redirectBack(['errors' => $errors]); 
     } 

     public function threadCreated($thread) 
     { 
      return $this->redirectAction('Forum\[email protected]', [$thread->slug]); 
     } 

     public function postCreateThread() 
     { 
       $threadSubject = $request->get('subject'); 
       $threadBody = $request->get('body'); 

       return $this->threadCreator->create($this , $threadSubject); 
     } 
} 

class ThreadCreator 
{ 
     private $spamDetector; 

     public function __construct(SpamDetector spamDetector) 
     { 
       $this->spamDetector = spamDetector; 
     } 

     public functin create(ThreadCreatorListener $listener , $subject) 
     { 
       if($this->spamDetector->isSpam($subject)) 
       { 
         return $listener->threadCreationError("Subject is spam"); 
       } 

       return $listener->threadCreated(); 
     } 

} 

Meine Frage ist, warum sollte ich einen ThreadCreatorListene r in ThreadCreator Klasse übergeben? Welchen Nutzen habe ich damit? Die Klasse könnte leicht einen Fehlercode wie das Rückgabe-Array zurückgeben ('Erfolg' => Wahr, 'Nachricht' => 'Spam erkannt'); was den Purpost lösen würde.

Auch, Ist das eine Art Design-Muster? Ich habe mit Listener Desing-Muster gegoogelt und Beobachter Design-Muster gefunden.

Grüße, Tanvir

+1

Bitte ich das nicht bekommen: in 'ForumThreadController :: postCreateThread()' was ist '$ this-> threadCreator'?! –

+0

Hallo, Ismail, Dies ist eine Instanz der Klasse ThreadCreator. Ich habe meinen Code aktualisiert. Bitte überprüfe es jetzt. – Rumel

+0

Überprüfen Sie Ihren AppServiceProvider oder einen anderen Anbieter, den Sie finden eine Bindung für 'ThreadCreatorListener', die für' ForumThreadController' auflösen !! –

Antwort

1
  1. ThreadCreator behandelt eine Tätigkeit, die eine Folgemaßnahmen erfordert. Um sicherzustellen, dass eine Aktion verfügbar ist, fragt sie nach einem Objekt, auf dem sie die Folgeaktion aufrufen kann.

  2. Code Wiederverwendung. Wenn Sie in Ihrer App viele ThreadCreator verwendet haben, würden Sie auf das Ergebnis jeder Verwendung reagieren.

    # bad - Easy to have out of date copy-paste 
    if ($has_spam == (new ThreadCreator($subject))) { 
        // do something 
        // maybe call a function 
    } 
    
    # good - Always obeys ForumThreadController 
    $thread_creator = (new ThreadCreator()) 
        ->create(new ForumThreadController, $subject);