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

时间:2019-05-10 05:57:24

标签: php laravel

我正在使用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();
    }
}

2 个答案:

答案 0 :(得分:1)

您可以执行的一种方法是制作一个Trait。特性实质上允许您在多个类中使用相同的代码。

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

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

别忘了为文件添加正确的名称空间。

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

class A 
{
    use Y;

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

如果特征是在其他命名空间中,则需要使用该命名空间提供完整的类名,或者将特征import引入类中。

答案 1 :(得分:0)

研究一段时间后。这是我的解决方案。

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

基本思想是在特征Y中使用抽象类Illuminate\Database\Eloquent\Model并在其之前初始化模型。