2015-03-08 8 views
6

Mam projekt laravel i muszę wykonać pewne obliczenia natychmiast po zapisaniu modelu i dołączeniu do niego pewnych danych.Wymowne załączanie/odłączanie/synchronizowanie powoduje uruchomienie dowolnego zdarzenia?

Czy jest jakieś zdarzenie uruchamiane w trybie lara po wywołaniu załącznika (lub odłączeniu/synchronizacji)?

+1

O ile wiem, nie ma żadnego zdarzenia. Jednak możesz użyć programów obsługi zdarzeń, aby wystrzelić jeden – cleanunicorn

+0

Dzięki! @hydrarulz tak, ale będę musiał zadbać o ręczne uruchamianie go za każdym razem, gdy użyję załącznika w tym konkretnym modelu, nie optymalnym –

Odpowiedz

18

Nie, nie ma żadnych zdarzeń relacji w Wymownym. Ale można łatwo zrobić to sam (podane na przykład Ticket belongsToMany Component relacji):

// Ticket model 
use App\Events\Relations\Attached; 
use App\Events\Relations\Detached; 
use App\Events\Relations\Syncing; 
// ... 

public function syncComponents($ids, $detaching = true) 
{ 
    static::$dispatcher->fire(new Syncing($this, $ids, $detaching)); 

    $result = $this->components()->sync($ids, $detaching); 

    if ($detached = $result['detached']) 
    { 
     static::$dispatcher->fire(new Detached($this, $detached)); 
    } 

    if ($attached = $result['attached']) 
    { 
     static::$dispatcher->fire(new Attached($this, $attached)); 
    } 
} 

obiekt zdarzenia tak proste, jak to:

<?php namespace App\Events\Relations; 

use Illuminate\Database\Eloquent\Model; 

class Attached { 

    protected $parent; 
    protected $related; 

    public function __construct(Model $parent, array $related) 
    { 
     $this->parent = $parent; 
     $this->related = $related; 
    } 

    public function getParent() 
    { 
     return $this->parent; 
    } 

    public function getRelated() 
    { 
     return $this->related; 
    } 
} 

następnie podstawowy słuchacz jako sensowny przykład:

// eg. AppServiceProvider::boot() 
    $this->app['events']->listen('App\Events\Relations\Detached', function ($event) { 
     echo PHP_EOL.'detached: '.join(',',$event->getRelated()); 
    }); 
    $this->app['events']->listen('App\Events\Relations\Attached', function ($event) { 
     echo PHP_EOL.'attached: '.join(',',$event->getRelated()); 
    }); 

i użytkowania:

$ php artisan tinker 

>>> $t = Ticket::find(1); 
=> <App\Models\Ticket> 

>>> $t->syncComponents([1,3]); 

detached: 4 
attached: 1,3 
=> null 

Oczywiście można to zrobić bez tworzenia obiektów Event, ale ten sposób jest wygodniejszy, elastyczny i po prostu lepszy.

+0

dzięki wspaniałej odpowiedzi! więc będę musiał użyć mojej nowej zdefiniowanej funkcji (syncComponents w twoim przykładzie) z moim modelem podczas synchronizacji? –

+1

Tak, zgadza się. –

+0

OK, jest to w rzeczywistości to, czego chciałem uniknąć, aby przepisać każdy plik, w którym wywoływana jest funkcja attach/sync. Ale dałeś mi bardzo dobrą odpowiedź kolega! –

2

kroki, aby rozwiązać swój problem:

  1. Tworzenie niestandardowych BelongsToMany relację
  2. W BelongsToMany klienta ręcznym dołączyć, odłączyć, synchronizacji i updateExistingPivot metody
  3. W nadpisane metoda wysyłkowych pożądanych zdarzeń. Metoda
  4. Zastąp belongsToMany() w modelu i przywrócić zwyczaj relacja nie domyślnie stosunku

i to wszystko. Stworzyłem pakiet, który już to robi: https://github.com/fico7489/laravel-pivot