2016-04-08 26 views
2

laravel 5.1

benim AbstractModel uzanır her Modeli için tek bir model gözlemci kayıt çalışıyorum (kim Illuminate \ Veritabanı uzatıyoruz \ Etkili \ Modeli) .laravel her model örneği için varsayılan bir Gözlemci kayıt nasıl

Sorun, GenericModelObserver'ımın, AbstractModel'i devralan Modellerin tetiklediği olayları dinleyememesi.

Şimdiye kadar yaptığım şeyi göstereyim.

Bir Servis Sağlayıcı oluşturulmuş ve

<?php 

// app/Observers/GenericModelObserver.php 

namespace App\Observers; 

use App\Models\AbstractModel; 

class GenericModelObserver 
{ 
    public function saving(AbstractModel $model) 
    { 
     return $model->valid(); 
    } 
} 

Özet Modeli

Sonra/app.php

<?php 

// app/Providers/ObserverServiceProvider.php 

namespace App\Providers; 

use App\Models\Quotation; 
use App\Models\AbstractModel; 
use App\Observers\QuotationObserver; 
use App\Observers\GenericModelObserver; 
use Illuminate\Support\ServiceProvider; 

class ObserverServiceProvider extends ServiceProvider 
{ 

    public function boot() 
    { 
     AbstractModel::observe(GenericModelObserver::class); 
     Quotation::observe(QuotationObserver::class); 
    } 

    public function register() 
    { 

    } 
} 

benim sade, basit GenericModelObserver sahip yapılandırma içine sağlayıcıları dizinin son pozisyona koymak

<?php 

// app/Models/AbstractModel.php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class AbstractModel extends Model 
{ 
    // ... 
} 

My Quotation Model

<?php 

// app/Models/Quotation.php 

namespace App\Models; 

class Quotation extends AbstractModel 
{ 
    // ... 
} 

Fiyatlandırma kaydedildiğinde, GenericModelObserver kaydetme olayını veya başka bir olayı dinleyemez.

Aynısı, belirli bir Model Gözlemcisi olmayan diğer Modeller için de geçerlidir.

Bu doğru strateji mi? Önyükleme yöntemiyle her modele bir gözlemci bağlamak istemem.

basitçe bir üst sınıfını kapsamaz Neden

cevap

2

BaseObserver Ben Yerine modeli uzanan sizin Observers

<?php namespace App\Observers; 
class Quotation extends BaseObserver{ 
    //you can override any of the methods if you wish 
} 
+0

My problemi gibi bir şey yapabilirsiniz BaseObserver geçersiz kılmak tam olarak nasıl değildir. BaseObserver'ı bir kez iliştirmem ve bunu AbstractModel'i genişleten her örneği dinlemem gerekiyor. Denedim ama cevabını ihtiyacım olanla ilişkilendiremedin, beni aydınlatabilir misin? Çalıştığın için teşekkürler. –

3

yılında

<?php namespace App\Observers; 
class BaseObserver { 
    public function saving($model) 
    { 
     //do your thing here that apply to all observers, like caching 
    } 
} 

Sonra önbellek sistemi içinde benzer bir şey var ki - Senin yazma gözlemci olarak çalışacak kendi özelliği. Modeliniz sınıfında use Observable; yazarak

<?php 

namespace App\YourPackage\Traits; 

use Illuminate\Database\Eloquent\Model; 

trait Observable 
{ 
    public static function bootObservable() 
    { 
     static::updating(function (Model $model) { 
      dd('updating'); 
     }); 
    } 
} 

ve kullanmak: I Aşağıda
bazı temel özelliği yazdım.

Ayrıca öğreniminiz için özelliklerin nasıl önyükleme yaptığını bir yere not edin: Düzgün olarak önyüklemek için boot[TraitClassName] yöntemini özelliğe eklemeniz gerekir.
Asla sizin için boot yöntemini yazınız, bu tehlikeli! Ebeveyninizin modelinde

0

o

/** 
* If true will attach the observers of the parent class 
* @var bool 
*/ 
protected $shouldAttachParentObservers = true; 

public static function boot() 
{ 
    $instance = new static; 
    $instance->attachParentObservers(); 

    parent::boot(); 
} 


public function attachParentObservers() { 
    $parentClass = get_parent_class($this); 
    if(!empty($parentClass) && $this->shouldAttachParentObservers) { 
     $eventObservers = []; 
     foreach ($this->getObservableEvents() as $event) { 
      $eventObservers[$event] = ($this::$dispatcher->getListeners("eloquent.{$event}: {$parentClass}")); 
      foreach ($eventObservers[$event] as $observer) { 
       $eventName = "eloquent.{$event}: {$this::getClassName()}"; 
       $this::$dispatcher->listen($eventName, $observer); 
      } 
     } 
    } 
} 
/** 
* You may use different way to find the class name 
*/ 
public static function getClassName() { 
    return static::class; 
}