2015-12-18 12 views
7

Sto provando a inserire un carattere all'interno di una classe chiamata Pagina. Devo anche rinominare una funzione di tratto in modo che non si scontri con una funzione di classe esistente. I pensato Ho fatto tutto questo con successo ma ottengo un errore che indica la posizione sbagliata ?!Come chiamare un metodo tratto con alias

Call to undefined function App\Pages\Models\myTraitDefaultScope()

Ho anche provato: MyTrait\defaultScope($query) invece di cercare di rinominare la funzione in conflitto. Ma Allora ottengo il seguente errore:

Call to undefined function App\MyTrait\defaultScope()

Di seguito si riporta il tratto e la classe contenuta in file separati.

<?php 
namespace App; 

use Illuminate\Support\Facades\Auth; 

trait MyTrait{ 
    public function defaultScope($query){ 
     return $query->where('active', '1') 
    } 
} 

.

<?php namespace Modules\Pages\Models; 
use Illuminate\Database\Eloquent\Model; 
use App\MyTrait; 

class Page extends Model { 

    use MyTrait{ 
     MyTrait::defaultScope as myTraitDefaultScope; 
    } 

    public function defaultScope($query){ 
     return myTraitDefaultScope($query); 
    } 
} 

io non sono tutto ciò che impressionante a questo quindi per favore non sparare se ho qualcosa di male male :)

+2

Non sicuro al 100%, ma non dovrebbe che essere 'return $ this-> myTraitDefaultScope ($ query);' in modo che php cerca la funzione sullo stesso oggetto? –

risposta

4

Quando si 'usa' un tratto nella tua classe, la classe eredita tutti i metodi e le proprietà del tratto, come se si stava estendendo una classe astratta o un'interfaccia

Quindi, questo metodo di MyTrait :

public function defaultScope($query){ 
    return $query->where('active', '1') 
} 

verrà ereditata dal vostro Page classe

come avete alias questo metodo come: myTraitDefaultScope, per chiamare il metodo si dovrebbe chiamare nello stesso modo in cui si chiamare ogni altro metodo della classe Page:

public function defaultScope($query){ 

    //call the method of the class 
    return $this->myTraitDefaultScope($query); 
} 
+0

Grazie per aver chiarito le cose, ora funziona tutto bene! Altri hanno risposto prima ma hai fornito più dettagli! – Jammer

1

che si sta utilizzando caratteristica. Quindi punta alla classe corrente o genitore. Quindi, chiamare qualsiasi metodo dovrebbe essere come $ this-> method ($ params); sintassi.