如何使用别名调用特征方法

时间:2015-12-18 20:26:29

标签: php class laravel namespaces traits

我正在尝试在名为Page的类中放置一个特征。我还需要重命名一个特征函数,以便它不会与现有的类函数冲突。我想到我成功完成了所有这些但是我收到错误指向错误的位置?!

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

我也尝试过:MyTrait\defaultScope($query)而不是尝试重命名冲突功能。但是我得到以下错误:

Call to undefined function App\MyTrait\defaultScope()

以下是单独文件中包含的特征和类。

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

我对此并不是那么棒,所以如果我遇到严重错误请不要开枪:)

2 个答案:

答案 0 :(得分:6)

当你在班级中使用'特征'时,类继承特征的所有方法和属性,就像它是扩展抽象类或接口一样

所以,MyTrait的这种方法:

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

将由您的Page

继承

由于您将此方法别名为:myTraitDefaultScope,要调用该方法,您应该调用它,就像调用Page类的其他每个方法一样:

public function defaultScope($query){

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

答案 1 :(得分:1)

当你正在使用特质时。所以它指向当前或父类。因此,调用任何方法应该像 $ this-&gt;方法($ params); 语法。