2016-04-17 24 views
0

Ich bin ein Mitarbeitermodell in eine Blade Vorlage binden, und möchte das Ergebnis einer Eager Load Relation in ein Feld platzieren.Laravel 5.2 Objekt in Blade-Vorlage injizieren

In meinem Controller bauen ich die Sammlung für die Seite als:

$employee = User::with('country', 'activeOrganisationRole')->first(); 

Meine Form offen Anweisung lautet:

{!! Form::model($employee, ['route' => ['employee.role', $employee->uuid], 'method' => 'POST']) !!} 

Deshalb möchte ich $employee->country->name in eine Eingabe Laravel Collective form::text Anweisung füllen, aber ich Der Ländername kann nicht geladen werden. Alle anderen Felder in dem Formular werden perfekt aus der übergeordneten Auflistung geladen.

Mein Land Feld ist:

<div class="form-group"> 
    <label for="phone" class="control-label">Country</label> 
    {!! Form::text('country', null, ['id'=>'country', 'placeholder' => 'Country', 'class' => 'form-control']) !!} 
</div> 

Das obige Land Feld lädt die gesamte Beziehung in den Eingang führen. Was ist die korrekte Syntax für injecting $employee->country->name in diesen Eingang?

Übrigens funktioniert das perfekt, aber ich habe nichts damit gelernt!

<label for="title" class="control-label">Country</label> 
<input id="country" class="form-control" value="{!! $employee->country->country !!}" readonly> 

Antwort

1

Ich glaube, die FormBuilder in LaravelCollective verwendet data_get (eine Funktion Laravel Helfer) Attribute von Objekten zu erhalten. Punkte in Namen von Elementen sind jedoch irgendwie seltsam, also habe ich ein wenig in die Quelle für dich geforscht.

Sie haben eine der folgenden Möglichkeiten (durch meine Präferenz geordnet):

  1. Sie können eine Methode hinzufügen getFormValue in Ihrem Mitarbeitermodell genannt. Dies nimmt einen einzelnen Parameter, der der Name des Formularelements ist, das einen Wert anfordert. Implementieren Sie es so etwas wie diese:

    public function getFormValue($name) 
    { 
        if(empty($name)) { 
         return null; 
        } 
    
        switch ($name) { 
         case 'country': 
          return $this->country->country; 
        } 
    
        // May want some other logic here: 
        return $this->getAttribute($name); 
    } 
    

    ich eigentlich keine Dokumentation zu diesem Thema (wie manchmal die Art und Weise mit Laravel) finden konnte. Ich fand es nur durch trawling the source - obwohl es wirklich einfach ist mit PhpStorm shamless Stecker

    Der Nachteil dabei ist, dass Sie die Transformation und Versuch der Extraktion von Werten aus dem Mitarbeiter-Objekt mit data_get verlieren.

  2. Ändern Sie den Namen Ihres Textfelds in country[country]. In der Quelle ersetzt der Builder '[' und ']' durch '.' und '' wenn man in einem Objekt nach einem Attribut sucht. Dies bedeutet data_get wird nach country.country suchen.

  3. Ich lege dies hier für Menschen mit dem Problem in der Zukunft, aber es wird nicht empfohlen.

    Geben Sie Ihrem Mitarbeitermodell eine getCountryAttribute Methode. Wie unter der Überschrift "Form Model Accessors" in the documentation beschrieben, können Sie überschreiben, was von $ employee-> country zurückgegeben wird. Sie können also nicht auf das reale Objekt zugreifen.