2015-04-23 3 views
9

Ich möchte sicherstellen, dass ich Model-Events-Listener in Laravel 5 richtig verwendet habe und nichts vermasselt habe (Listener vs Handler?). Meine Lösung funktioniert gut, aber ich frage mich, ob ich nach Konzept und Konvention von Laravel 5.Verwenden von Model Events Listener in Laravel 5

Ziel entwickelt: immer gesetzt $ themen-> status_id auf einen bestimmten Wert, wenn Modell Speichern wird.

In app \ Providers \ EventServiceProvider.php

<?php namespace App\Providers; 

... 

class EventServiceProvider extends ServiceProvider { 

    ... 

    public function boot(DispatcherContract $events) 
    { 
     parent::boot($events); 

     Issue::saving('App\Handlers\Events\SetIssueStatus'); 
    } 

} 

In app \ Handlers \ Events \ SetIssueStatus.php

<?php namespace App\Handlers\Events; 

... 

class SetIssueStatus { 

    ... 

    public function handle(Issue $issue) 
    { 
     if (something) 
     { 
      $issueStatus = IssueStatus::where(somethingElse)->firstOrFail(); 
     } 
     else 
     { 
      $issueStatus = IssueStatus::where(somethingAnother)->firstOrFail(); 
     } 

     // issue_status() is One-to-One relations with IssueType (belongsTo) 
     $issue->issue_status()->associate($issueStatus); 
    } 

} 

Vielen Dank für Ihre Zeit.

+0

Sie möchten dieses Ereignis nur für ein Modell verwenden oder möchten Sie es in mehr als einem Modell verwenden? –

+0

Diese Logik ($ issue-> status_id) Ich möchte nur für Issue-Modell verwenden, aber in Zukunft möchte ich mehr Logik zu diesem und anderen Modell hinzufügen. – zss61890

+0

Es gibt keine richtige oder falsche Antwort dafür; Es hängt von der Anwendung ab. Wählen Sie daher zu schließen, da es in erster Linie auf der Meinung der Meinung ist. –

Antwort

15

Wie Sie sagten, Sie haben eine funktionierende Version und es ist eine gültige Version, jetzt liegt es an Ihnen, herauszufinden, ob es für Sie in Ordnung ist.

Nur um zu verdeutlichen, sage ich nicht, dass dies bessere Lösungen sind, sie sind nur ein anderer Weg.

Da das, was Sie tun, ist spezifisch für das Emissionsmodell oder zumindest scheint es nicht ein generisches Ereignis zu sein, könnten Sie es auf Ihrem Modell einrichten direkt

<?php namespace App; 

use Illuminate\Database\Eloquent\Model; 
use IssueStatus; 

class Issue extends Model { 


    protected static function boot() 
    { 
     parent::boot(); 

     static::saving(function($issue){ 
      if (something) 
      { 
       $issueStatus = IssueStatus::where(somethingElse)->firstOrFail(); 
      } 
      else 
      { 
       $issueStatus = IssueStatus::where(somethingAnother)->firstOrFail(); 
      } 

      // issue_status() is One-to-One relations with IssueType (belongsTo) 
      $issue->issue_status()->associate($issueStatus); 

     }); 
    } 
} 

aber wenn Ihre Veranstaltung in der Tat eine generische und Sie möchten es über mehrere Modelle hinweg verwenden, könnten Sie das gleiche erreichen. Sie müssen nur den Code aus dem Modell extrahieren und Eigenschaften (wie Sie mit weichen löschen) verwenden

Zuerst erstellen wir unser Merkmal (in diesem Fall haben wir auf der Wurzel unserer App erstellt) und extrahieren Sie den Code, schrieb ich vor, aus dem Modell:

<?php namespace App 

use IssueStatus; 

trait IssueStatusSetter 
{ 
    protected static function boot() 
    { 
     parent::boot(); 

     static::saving(function($model){ 
      if (something) 
      { 
       $issueStatus = IssueStatus::where(somethingElse)->firstOrFail(); 
      } 
      else 
      { 
       $issueStatus = IssueStatus::where(somethingAnother)->firstOrFail(); 
      } 

      // issue_status() is One-to-One relations with IssueType (belongsTo) 
      $model->issue_status()->associate($issueStatus); 

     }); 
    } 
} 

nun auf den Modellen, wo Sie es verwenden möchten, importieren Sie einfach den Zug und erklären, es ist Gebrauch:

<?php namespace App; 

use Illuminate\Database\Eloquent\Model; 
use IssueStatusSetter; 

class Issue extends Model { 

    use IssueStatusSetter; 

} 

Nun ist diese letzte Option, die ich Ihnen gezeigt, es ist ein Sie haben die generische Option, die Sie auf jedes Modell anwenden können, indem Sie es einfach deklarieren auf der Oberseite Ihres Modells.

+0

Vielen Dank für dieses Beispiel und die Explonation. Jetzt verstehe ich, dass dieses Verhalten nur für das Issue-Modell spezifisch ist, also gibt es keinen Grund, es zum Ereignis-Listener zu extrahieren. – zss61890

+0

funktioniert es in 5.1? Ich habe versucht, aber statisch :: Speichern ist nicht zu hören oder nicht funktionieren – carlituxman