2017-01-11 2 views
1

Ich verwende Jenssegers Optimus-Paket, um meine URLs zu verschleiern.Wie benutzt man Jenssegers Optimus in Laravel Models?

Momentan rufe ich es in jedem einzelnen Controller an, der sich mit get-Anfragen beschäftigt. Problem ist, ich muss meine IDs in fast allen Methoden in meinen Controllern ständig codieren und dekodieren.

Z. B .:

use Jenssegers\Optimus\Optimus; 

    class ResponseController extends Controller 
    { 
     protected $optimus; 

     public function __construct(Optimus $opt) 
     { 
      $this->optimus = $opt; 

     } 

     public function index() 
     { 

      $labels = Label->get(); 

      foreach ($labels as $key => $label){ 
       $label->id = $this->optimus->encode($label->id); 
       $labels[$key] = $label; 
      } 

      return view('responses/index', compact('labels')); 
     } 

     public function show($id) 
     { 
      $id = $this->optimus->decode($id); 

      $label = Label::get($id); 

     } 

    } 

Ich dachte an die Schaffung Accessoren & Mutatoren immer die IDs der Modelle zu verschlüsseln Ich muss in der URL verschleiern. Also würde ich sie in einen Zug bringen, um den Code wiederzuverwenden. Ich habe versucht:

use Jenssegers\Optimus\Optimus; 

    trait EncodeId{ 

     public function getIdAttribute($value, Optimus $optimus) 
     { 

     return $optimus->encode($value); 
     } 

    } 

Dann habe ich dieses Merkmal zu meinem Modell hinzugefügt. Laravel würde jedoch einen Fehler über Optimus $ optimus in der Methodendefinition werfen. Es wurde gesagt, dass $ optimus eine Art von Jenssegers \ Optimus \ Optimus sein sollte, obwohl ich es deklariere. Das funktioniert bei Controllern gut, bei Modellen funktioniert das anscheinend nicht. Oder ich sollte in diesem Fall nicht versuchen, ein Merkmal zu verwenden.

Hier ist der tatsächliche Fehler:

FatalThrowableError in EncodeId.php line 10: 
Type error: Argument 2 passed to App\Label::getIdAttribute() must be an instance of Jenssegers\Optimus\Optimus, none given, called in /home/../vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 2734 

Es wäre wirklich schön, wenn ich eher seine Codierung und Decodierung Funktionen mehrere Male in meinem Controller als Aufruf Optimus Verschleierung auf Modellebene nutzen könnten.

Es gibt ein anderes Paket namens FakeID, das dazu gedacht ist. Ich habe versucht, es in meinem Projekt zu implementieren, aber es hat nicht funktioniert. Ich bin mir ziemlich sicher, dass ich selbst damit umgehen könnte, da es eine einfache Aufgabe zu sein scheint.

+0

Bitte aktualisieren Sie Ihre Frage mit dem genauen Fehler, damit wir sie kommentieren können – Gayan

+0

@Gayan Sure. Ich habe es nicht dort hingelegt, weil ich meine Trait-Datei verloren habe. Bald werde ich es wiederherstellen, um den Fehler zu reproduzieren. Sobald ich nach Hause komme, werde ich meine Frage aktualisieren. Danke – Leandro

+0

@Gayan Ich habe gerade den vollen Fehler hinzugefügt. – Leandro

Antwort

1

Get-Mutatoren (AKA-Accessoren) werden zusammen mit einem einzelnen Argument aufgerufen. Deshalb erhalten Sie expected to be a type of Jenssegers\Optimus\Optimus Fehler als Jenssegers\Optimus\Optimus wird nicht von Framework beim Aufruf eines Prozessors oder Mutators (wie Controller) injiziert.

Lesen Sie einfach diesen Schnipsel aus dem Quellcode (Linie 2632):

public function getAttributeValue($key) 
    { 
     $value = $this->getAttributeFromArray($key); 
     // If the attribute has a get mutator, we will call that then return what 
     // it returns as the value, which is useful for transforming values on 
     // retrieval from the model to a form that is more useful for usage. 
     if ($this->hasGetMutator($key)) { 
      return $this->mutateAttribute($key, $value); 
     } 

     //...  
    } 

Und jetzt der Ruf an $this->mutateAttribute($key, $value); (Linie 2736)

protected function mutateAttribute($key, $value) 
    { 
     return $this->{'get'.Str::studly($key).'Attribute'}($value); 
    } 

Hast du verstanden, jetzt? Ein/mutator wird zusammen mit nur einem Argument aufgerufen: $value.

Lösung

Sie so etwas versuchen könnte:

public function getIdAttribute($value) 
{ 
    return app(Optimus::class)->encode($value); 
} 

Aufrufen Optimus Instanz aus dem Behälter (app()) würde den Trick.

+0

Oh. Eigentlich dachte ich, das könnte das Problem sein. Ich sah im Doc-Beispiel nur ein Argument, aber ich war mir nicht sicher, ob es nur ein Argument erlaubt war.Ich habe versucht, codieren als eine statische Methode für Optimus zu verwenden, es hat eindeutig nicht funktioniert. Ich werde deine Lösung testen, sobald ich nach Hause komme. – Leandro

+0

@Leandro Ich habe die vorgeschlagene Lösung nicht getestet, aber die Optimus-Instanz aus dem Container zu holen ist der richtige Weg. --- Eu tastei ainda, mas obter a instância tun Optimus do container ist eine direcao certa. – felipsmartins

+0

Ja, das funktioniert. Danke vielmals. – Leandro