2016-04-15 31 views
24

Sono un neofita di Tratti, ma ho un sacco di codice che si sta ripetendo nelle mie funzioni e voglio usare i tratti per rendere il codice meno disordinato. Ho creato una directory Traits nella mia directory Http con un tratto denominato BrandsTrait.php. E tutto ciò che fa è chiamare su tutte le marche. Ma quando provo a chiamare BrandsTrait nei miei prodotti Controller, in questo modo:Come utilizzare i tratti - 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')); 
    } 
} 

mi dà un errore che dice Metodo [BrandsTrait] non esiste. Suppongo di inizializzare qualcosa o di chiamarlo in modo diverso?

Ecco il mio 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(); 
    } 
} 

risposta

30

Pensate a tratti come definire una sezione della classe in un luogo diverso, che può essere condiviso da molte classi. Inserendo use BrandsTrait nella tua classe ha quella sezione.

Cosa vuoi scrivere è

$brands = $this->brandsAll(); 

Questo è il nome del metodo nel vostro carattere.

Inoltre, non dimenticare di aggiungere un ritorno al tuo metodo brandsAll!

+0

oh wow, non l'ho notato, mio ​​errore. Grazie. – David

+1

Posso ottenerlo con l'ereditarietà, cosa offre in più i tratti? –

+6

PHP non supporta l'ereditarietà multipla e, in quanto tale, consente solo di estendere una singola classe. Con i tratti comunque, puoi usare quanti ne vuoi. – 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')); 
    } 
}