2016-05-10 11 views
0

Ich habe 2 Modelle:Laravel globale Funktion

Bill: id, account_id, descripcion, monto_pagado, SALDO

Zahlung: id, bill_id,

Jedes Mal, wenn jemand monto Legen Sie eine neue Rechnung auf das Konto oder fügen Sie eine neue Zahlung ein, die ich vorschlage, um den Kontostand zu berechnen.

Was wäre der beste Ort, um dies zu erreichen:

  • als Service
  • als Mutatoren im Modell
  • als Funktion in der Steuerung

weiß ich, ich hätte nenne das an anderen Orten meines Projekts. Also ich möchte, dass es eine globale Funktion ist. Was wäre der beste Ort dafür?

+0

Erstellen Sie eine Klasse, injizieren Sie sie in jede gewünschte Klasse und verwenden Sie $ this-> billing ($ somthing); Dies ist der beste einfache Weg, soweit ich weiß –

Antwort

0

Sie könnten ein Ereignis in Ihren Modellen verwenden. Verwenden Sie creating, wenn Sie berechnen möchten, bevor das Modell tatsächlich in der Datenbank erstellt wird, oder created, wenn Sie nach der Erstellung berechnen möchten.

In Ihrer App \ Providers \ AppServiceProvider :: Boot() -Methode, definieren die Ereignisse für beide Modelle:

class AppServiceProvider extends ServiceProvider 
{ 
    public function boot() 
    { 
     Bill::creating(function ($bill) { 
      // Do something with $bill 
     }); 
    } 

    // etc 
} 

Code eine Wiederholung zu vermeiden, können Sie eine Eigenschaft verwenden und es in beiden Klassen verwenden. Nennen Sie es PretendCalculationTrait zum Beispiel und legen Sie sie in app/Traits (das Verzeichnis erstellen, wenn erforderlich):

<?php 

namespace App\Traits; 

trait PretendCalculationTrait 
{ 
    public function pretendCalculate() 
    { 
     // Do your stuff 
    } 
} 

Dann in Ihrem Modell verwenden dieses Merkmal:

class Bill extends Eloquent 
{ 
    use App\Traits\PretendCalculationTrait; 

    // etc. 
} 

schließlich in Ihrem AppServiceProvider, rufen Sie die Methode definiert in dem Merkmal:

public function boot() 
{ 
    Bill::creating(function ($bill) { 
     return $bill->pretendCalculate(); 
    }); 

    Payment::creating(function ($payment) { 
     return $payment->pretendCalculate(); 
    }); 
} 

See Laravel Model Events Dokumentation für weitere Details.

0

Eine mögliche Lösung, da Sie erwähnt haben wollen, dass es sich um eine globale Funktion handelt, ist die Autoloading-Funktion von Laravel.

Erstellen Sie eine Datei, die die Funktion für Ihre Berechnung enthält. Es kann überall platziert werden und andere Funktionen enthalten, aber aus Platzgründen werden wir es hier platzieren: App/Http/customFunctions.php. In Ihrer Datei, erstellen Sie Ihre Funktion:

function pretendCalculation() 
{ 
    return $something; 
} 

Als nächstes sagt Laravel automatisch zu laden, indem es sich auf Ihre autoloading Liste in composer.json fügt hinzu:

"autoload": { 
    "classmap": [ 
     "database" 
    ], 
    "psr-4": { 
     "App\\": "app/" 
    }, 
    "files": [ 
     "app/Http/customFunctions.php" <-- Here is the new file 
    ] 

Dann führen Sie einfach ein composer dump auto-load -o oder dergleichen, und jetzt Sie haben überall in Ihrer Anwendung Zugriff auf diese Datei/alle Funktionen innerhalb der Datei.