Laravel / PHP Refactor код для использования одинаковых модальных - PullRequest
0 голосов
/ 10 мая 2019

Я использую 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 ]

1 голос
/ 10 мая 2019

Один из способов сделать это - создать черту .Черты, по сути, позволяют вам использовать один и тот же код в нескольких классах.

Исходя из кода в вашем вопросе, ваша черта будет выглядеть примерно так:

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

Не забудьте добавитьправильное пространство имен для файла.

Тогда в других ваших классах у вас будет ключевое слово use внутри тела класса:

class A 
{
    use Y;

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

Если ваша черта находится в другомзатем вам нужно либо дать полное имя класса вместе с пространством имен, либо импортировать признак в ваш класс.

0 голосов
/ 24 мая 2019

После исследования некоторое время. Вот мое решение.

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

Основная идея состоит в том, чтобы использовать абстрактный класс Illuminate\Database\Eloquent\Model в признаке Y и инициализировать модель перед ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...