2016-04-14 6 views
0

, wie ich einige Attribute aus dem Modell zum Beispiel in nur einigen Strecken, verstecken Sie:Laravel: Ausblenden von Modellattribute nur in einigen Routen

I $ Elemente versteckt geschützt bin mit verstecken, aber diese verstecken sich in allen meinen Funktionen oder erholsame Routen (Index, show)

$hidden = [ 
    'coachVisibility', 'thumbnail', 'studentVisibility', 
    'isHTML', 'studentIndex', 'coachIndex', 
    'isURL', 'source', 'path', 
    'status', 'updateTime', 'isfolder', 
    'parentResource', 'idModifierUser', 'idResourceType', 
    'idCreatorUser', 'idCreationCountry', 'user', 
    'country', 'resource' 
]; 

ich möchte nur in Index-Funktion verstecken, aber in Show-Funktion will ich nichts verbergen.

Antwort

0

Sie können das addHidden Methode auf den Modellen:

class UsersController 
{ 
    public function index() 
    { 
     return User::all()->each(function ($user) { 
      $user->addHidden([.........]); 
     }); 
    } 
} 

Sobald this PR verschmolzen wird, können Sie es auf die Sammlung direkt anrufen:

class UsersController 
{ 
    public function index() 
    { 
     return User::all()->makeHidden([.........]); 
    } 
} 

Entsprechend Ihrem Kommentar können Sie alle diese Felder in der $hidden Eigenschaft Ihres Modells behalten und stattdessen machen sie sichtbar nur in der show Methode:

public function show($id) 
{ 
    return CTL_Resource::where('idResource', $id) 
     ->with('tags', 'quickTags', 'relatedTo') 
     ->firstOrFail()->makeVisible([ 
      'coachVisibility', 'thumbnail', 'studentVisibility' 
     ]); 
} 
+0

ist das korrekt?'öffentliche Funktion show ($ id) { $ resource = CTL_Resource :: wo ('idResource', $ id) -> first(); if ($ resource) Antwort zurückgeben() -> json ( $ resource-> laden ('Tags', 'quickTags', 'relatedTo') -> addHidden (['coachVisibility', 'thumbnail', 'studentVisibility ']) ); sonst Antwort zurückgeben (null, 404); } ' weil ich ein leeres Objekt bekomme :(im mit' $ resource = CTL_Resource :: wo ('idResource', $ id) -> first(); 'weil ich UUIDs verwende –

+0

@CanKerDiAlike - du bekommst ein leeres Objekt? Was erhalten Sie ohne den 'addHidden' Aufruf? –

+0

das gesamte Objekt außer den Feldern, die ich versteckte in meinem Modell mit' concertected $ hidden = ['einige', 'Daten'] ' –

2

Verwenden Sie Transformatoren, um Rückgabedaten beliebig zu transformieren.

Für zB:

Einen abstrakten Transformator:

namespace App\Transformers; 

abstract class Transformer 
{ 

    public function transformCollection(array $items) 
    { 
     return array_map([$this, 'transform'], $items); 
    } 

    public abstract function transform($item); 
} 

Dann für jede Methode benutzerdefinierte Transformatoren erstellen, wenn Sie mögen:

namespace App\Transformers; 

use App\User; 

class UserTransformer extends Transformer { 

    public function transform($user) { 

     return [ 
      'custom_field' => $user['foo'], 
      'another_custom_field' => $user['bar'] 
      ... 
     ]; 

    } 
} 

Dann in Ihrem Controller:

... 

public function index(Request $request, UserTransformer $transformer) 
{ 
    $users = User::all(); 

    return response()->json([ 
     'users' => $transformer->transformCollection($users->toArray()) 
    ], 200); 
} 

Es gibt ein paar Vorteile zu diesem:

  1. Sie/zeigen können Daten ausblenden, wie Sie mit speziellen Transformatoren
  2. In-Fall, dass Sie die Spaltennamen in der Tabelle ändern entscheiden zu wollen, wird dafür sorgen, Ihre Transformatoren, dass Clients, die Ihre Daten erhalten, werden nicht beschädigt.
+0

nie zuvor über Transformers gehört, seine eine Abhängigkeit/Bibliothek oder einfach nur, um die Klasse wie Ihr Beispiel zu erstellen? –

+0

@CankerDiAlike Es ist keine Bibliothek. Erstellen Sie die Klassen einfach selbst. –

+0

ok, geben Sie mir eine Chance zu versuchen, bevor Sie Ihre Antwort auswählen. :) Danke –