Laravel/PHP重构代码以使用相同的不同模式

Laravel/PHP重构代码以使用相同的不同模式,php,laravel,Php,Laravel,我使用的是Laravel(PHP)。我想重构下面的代码,要求类A和类B使用相同的funsth()。funSth()在两个类中重复,而唯一的区别是模型 有没有一种方法可以简化为以下内容?是否可以将其重构为第二个代码 当前: class A { public function funSth(){ Models\Profile::create(); } public function main(){ $this->funA();

我使用的是Laravel(PHP)。我想重构下面的代码,要求类A和类B使用相同的funsth()。funSth()在两个类中重复,而唯一的区别是模型

有没有一种方法可以简化为以下内容?是否可以将其重构为第二个代码

当前:

class A {

    public function funSth(){
        Models\Profile::create();
    }

    public function main(){
        $this->funA();
    }
}

class B {
    public function funSth(){
        Models\Location::create();
    }

    public function main(){
        $this->funB();
    }
}
预期:

class A {
    public function main(){
        (new Y)->funSth();
    }
}

class B {
    public function main(){
        (new Y)->funSth();
    }
}

class Y {
    public function funSth(){
         Models\AnyModel::create();
    }
}

你可以这样做的一个方法是做一个。Traits本质上允许您在多个类中使用相同的代码

根据您问题中的代码,您的特征可能类似于:

trait Y
{
公共职能
{
Models\AnyModel::create();
}
}
不要忘记为文件添加正确的名称空间

然后在其他类中,您可以在类主体中使用
use
关键字:

A类
{
使用Y;
公共功能main()
{
$this->funA();
}
} 

如果您的trait位于不同的名称空间中,那么您需要在名称空间中提供完整的类名,或者将trait输入到您的类中。

研究一段时间后。这是我的解决办法

use Illuminate\Database\Eloquent\Model;

trait Y
{
    protected function create(Model $model, array $attributes){
        model->create($attributes);
    }
}
因此,对于A类和B类:

class A 
{
    use Y;

    public function main($data){
        $this->create((new Models\ModelAA), $data)
    }
}

class B 
{
    use Y;

    public function main($data){
        $this->create((new Models\ModelBB), $data)
    }
}


其基本思想是在trait Y中使用抽象类
illighted\Database\Eloquent\Model
,并在此之前初始化模型

下面的答案解决了你的问题还是你仍然有困难?嗨,罗斯,谢谢你的回答。但是在trait Y中没有定义funA()。trait中的funSth()无法基于类A和类B创建模型。