2015-12-18 23 views
7

Próbuję umieścić cechę w klasie o nazwie Strona. Muszę również zmienić nazwę funkcji funkcji, aby nie kolidowała z istniejącą funkcją klasy. I myślałem, że Zrobiłem to wszystko pomyślnie, ale dostałem błąd, który wskazuje na niewłaściwą lokalizację ?!Jak wywołać metodę cechy z aliasem

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

Próbowałem również: MyTrait\defaultScope($query) zamiast próbować zmienić nazwę konflikt funkcji. Ale wtedy pojawia się następujący błąd:

Call to undefined function App\MyTrait\defaultScope()

Poniżej jest cecha i klasy zawarte w oddzielnych plikach.

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

nie jestem wszystkim, co niesamowite w tym więc proszę nie strzelać, jeśli mam coś źle źle :)

+2

Nie 100% pewien, ale nie powinno to być 'return $ this-> myTraitDefaultScope ($ query);' tak że php szuka funkcji na tym samym obiekcie? –

Odpowiedz

4

Kiedy „użytkowania” cechę w swojej klasie, klasa dziedziczy wszystkie metody i właściwości cechy, jak gdyby był to rozszerzenie klasy abstrakcyjnej lub interfejsu

tak, to sposób MyTrait :

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

będą dziedziczone przez klasy

Page jak już alias tę metodę jako: myTraitDefaultScope, aby wywołać metodę należy nazwać w ten sam sposób można by nazwać każdą inną metodę klasy Page:

public function defaultScope($query){ 

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

Dzięki za oczyszczenie wszystkiego, wszystko działa już dobrze! Inni odpowiedzieli wcześniej, ale podałeś więcej szczegółów! – Jammer

1

Jak używasz cechę. Więc wskazuje na bieżącą lub rodzicielską klasę. Zatem wywołanie dowolnej metody powinno być takie jak: $ this-> method ($ params); składnia.