2016-04-15 7 views
24

Ich bin neu in Traits, aber ich habe eine Menge Code, der sich in meinen Funktionen wiederholt, und ich möchte Traits verwenden, um den Code weniger unordentlich zu machen. Ich habe ein Verzeichnis Traits in meinem Verzeichnis Http mit einer Eigenschaft namens BrandsTrait.php gemacht. Und alles, was es tut, ist alle Marken anzurufen. Aber wenn ich versuche BrandsTrait in meine Produkte Controller zu nennen, wie folgt aus:Traits - Laravel 5.2

use App\Http\Traits\BrandsTrait; 

class ProductsController extends Controller { 

    use BrandsTrait; 

    public function addProduct() { 

     //$brands = Brand::all(); 

     $brands = $this->BrandsTrait(); 

     return view('admin.product.add', compact('brands')); 
    } 
} 

es gibt mir eine Fehlermeldung, Methode [BrandsTrait] existiert nicht. Soll ich etwas initialisieren oder anders nennen?

Hier ist meine BrandsTrait.php

<?php 
namespace App\Http\Traits; 

use App\Brand; 

trait BrandsTrait { 
    public function brandsAll() { 
     // Get all the brands from the Brands Table. 
     Brand::all(); 
    } 
} 

Antwort

30

Denken Sie an Eigenschaften wie einen Abschnitt Ihrer Klasse an einem anderen Ort zu definieren, die von vielen Klassen geteilt werden können. Indem Sie use BrandsTrait in Ihrer Klasse platzieren, hat es diesen Abschnitt.

Was Sie schreiben wollen, ist

$brands = $this->brandsAll(); 

, dass der Name der Methode in Ihrer Eigenschaft ist.

Auch - vergessen Sie nicht, eine Rückkehr zu Ihrer brandsAll Methode hinzuzufügen!

+0

oh wow, habe das nicht bemerkt, mein Fehler. Danke. – David

+1

kann ich dies mit Vererbung erreichen, was plus bieten die Merkmale? –

+6

PHP unterstützt keine Mehrfachvererbung und als solches können Sie nur eine einzelne Klasse erweitern. Mit Eigenschaften können Sie jedoch beliebig viele verwenden. – maddockst

2
use App\Http\Traits\BrandsTrait; 

class ProductsController extends Controller { 

    use BrandsTrait; 

    public function addProduct() { 

     //$brands = Brand::all(); 

     $brands = $this->brandsAll(); 

     return view('admin.product.add', compact('brands')); 
    } 
}