2015-12-18 7 views
7

Ich versuche, ein Merkmal in einer Klasse namens Page zu platzieren. Ich muss auch eine Merkmalsfunktion umbenennen, damit sie nicht mit einer vorhandenen Klassenfunktion kollidiert. I dachte Ich habe das alles erfolgreich, aber ich bekomme einen Fehler, der auf den falschen Ort zeigt ?!So rufen Sie eine Merkmalsmethode mit Aliasnamen auf

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

Ich habe auch versucht: MyTrait\defaultScope($query) anstatt zu versuchen, die widerstreitenden Funktion umzubenennen. Aber dann bekomme ich folgende Fehlermeldung:

Call to undefined function App\MyTrait\defaultScope()

unten ist das Merkmal und Klasse in separaten Dateien enthalten sind.

<?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); 
    } 
} 

Ich bin gar nicht so genial an diese also bitte nicht schießen, wenn ich etwas schief haben :)

+2

nicht zu 100% sicher, aber sollte das nicht sein 'return $ this-> myTraitDefaultScope ($ query);' so dass php nach der Funktion auf dem gleichen Objekt sucht? –

Antwort

4

Wenn Sie in Ihrer Klasse ‚Verwendung‘ eine Eigenschaft, die Klasse erbt alle Methoden und Eigenschaften des Merkmals, wie wenn es eine abstrakte Klasse wurde Verlängerung oder eine Schnittstelle

Also, diese Methode der MyTrait : myTraitDefaultScope, die Methode aufzurufen:

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

wird von Ihrem Page Klasse

als wie Sie diese Methode haben aliased

vererbt werden Sie sollten es auf die gleiche Art und Weise rufen Sie jede andere Methode der Page Klasse nennen würde:

public function defaultScope($query){ 

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

Danke für die Klärung, alles läuft gut! Andere haben früher geantwortet, aber Sie haben mehr Details geliefert! – Jammer

1

Wie Sie verwenden Zug. Es zeigt also auf die aktuelle oder übergeordnete Klasse. Daher sollte der Aufruf einer Methode wie folgt sein: $ this-> method ($ params); Syntax.