2015-04-23 16 views
9

Mi piacerebbe essere sicuro di aver usato correttamente gli ascoltatori di eventi modello in Laravel 5 e non ho incasinato nulla (listener vs handler?). La mia soluzione funziona bene, ma mi chiedo se ho sviluppato secondo il concetto e la convenzione di laravel 5.Utilizzo del listener di eventi del modello in Laravel 5

Obiettivo: Impostare sempre $ problema-> status_id su qualche valore quando il modello è il risparmio.

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 \ Eventi \ 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); 
    } 

} 

Grazie per il vostro tempo.

+0

si desidera utilizzare questo evento su un modello o si desidera utilizzarlo in più di un modello? –

+0

Questa logica ($ issue-> status_id) Voglio usarla solo per il modello Issue, ma in futuro voglio aggiungere più logica a questo e ad altri modelli. – zss61890

+0

Non c'è una risposta giusta o sbagliata per questo; dipende dall'applicazione. Pertanto, si vota per chiudere poiché si basa principalmente su opinioni. –

risposta

15

Come hai detto tu hai una versione funzionante ed è valida, ora tocca a te capire se va bene per te.

Giusto per chiarire, non sto dicendo che queste sono soluzioni migliori, sono solo un valido modo diverso.

Dal momento che quello che stai facendo è specifico per il modello di vendita, oppure per lo meno non sembra essere un evento generico, è possibile installarla sul vostro modello direttamente

<?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); 

     }); 
    } 
} 

ma se il vostro evento è in effetti uno generico e tu vuoi usarlo su più Modelli, potresti ottenere la stessa cosa. Hai solo bisogno di estrarre il codice dal modello e utilizzare i tratti (come fai con le soft delete)

Per prima cosa creiamo il nostro tratto (in questo caso abbiamo creato sulla radice della nostra app) ed estrai il codice, ho scritto prima, dal modello:

<?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); 

     }); 
    } 
} 

Ora sui modelli in cui si desidera utilizzarlo, è sufficiente importare il tratto e dichiarare il suo uso:

<?php namespace App; 

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

class Issue extends Model { 

    use IssueStatusSetter; 

} 

Ora, questa ultima opzione vi ho mostrato che è un opzione generica che puoi applicare a ogni modello semplicemente dichiarandone l'utilizzo sulla parte superiore del tuo modello.

+0

Grazie per questo esempio ed esplona. Ora capisco che questo comportamento è specifico solo per il modello Issue, quindi non c'è motivo di estrarlo nel listener di eventi. – zss61890

+0

funziona in 5.1? ho provato ma statico: il salvataggio non è ascoltare o non funzionare – carlituxman

Problemi correlati