Как переключить пользовательскую реализацию интерфейса при условии в http-контроллере в Laravel - PullRequest
0 голосов
/ 04 апреля 2019

У меня в контроллере есть метод, который в основном просто сохраняет форму в базе данных. Моя форма очень большая и имеет более 30-40 полей. Поэтому мне нужно хранить эту информацию в разных 3 таблицах при условии.

Например:

foreach($request->all() as $answer):

    if($answer->employeeType === 1){

    //store data to type_one_table

   } else if($answer->employeeType === 2){

     //store data to type_two_table

   } else if($answer->employeeType === 3){

     //store data to type_two_table

  } else {

    //store data to some_other_table

    }

endforeach;

Так что я подумал о том, чтобы использовать какой-нибудь пользовательский StoreInterface, у которого будет какой-то store метод.

и извлеките вышеприведенную логику в собственную реализацию.

И тогда в моем конструкторе контроллеров получим тот экземпляр интерфейса.

Но как я могу назвать, какой implementation мне нужен для конкретного условия.

Могу ли я сделать это контроллером?

Или я должен использовать другую стратегию в этом случае.

пожалуйста, ведите меня.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

У вас может быть общий интерфейс, подобный этому:

interface EmployeeStoreContract
{
    public function saveAnswer();
}

Затем реализуйте это для всех различных способов сохранения ответа, например ::100100

class FirstTypeEmployee implements EmployeeStoreContract
{
    public function saveAnswer()
    {
        // do something
    }
}

А в вашем контроллере выяснить, как сохранить данные запроса:

public function store()
{
    $employeeTypesMap = [
        1 => 'FirstTypeEmployee',
        2 => 'SecondTypeEmployee',
        3 => 'ThirdTypeEmployee',
    ];

    foreach ($request->all() as $answer) {
        $employeeType = $answer->employeeType;

        if (!array_key_exists($employeeType, $employeeTypesMap)) {
            throw new \InvalidArgumentException('Answer type is not available.');
        }

        $employeeStrategyClass = "App\\Service\\Employee\\{$employeeTypesMap[$employeeType]}";
        $employeeStrategyObject = new $employeeStrategyClass;

        $employeeStrategyObject->saveAnswer($answer);
    }
}

Обратите внимание, что пространство имен, в котором находятся эти классы App\Service\Employee, может быть любым. Также не стесняйтесь создавать абстрактный класс или черту для повторного использования некоторых функциональных возможностей каждого класса сотрудников.

0 голосов
/ 04 апреля 2019

Может быть много подходов.

Я предложу 2 способа, которыми я бы лично использовал:

1) Создайте выделенные красноречивые модели по одному для каждого случая.

Например:

if($answer->employeeType === 1){
     EmployeeOne::create($answer);
}

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

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use DB;

class EmployeeOne extends Model
{
    protected $table = 'type_one_table';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        // your db field names
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
    ];

    public $timestamps = false;
}

Убедитесь, что ключи массива массива, который вы передаете в функцию создания, должны соответствовать вашей БДполя.Я только что дал вам пример первого if, чтобы вы могли взять его отсюда.

2) Другой подход заключается в создании модели, которая принимаетв качестве параметра имя таблицы.Таким образом, основываясь на вашем if, вы передадите имя таблицы, которую хотите вставить, и данные, которые нужно вставить.

if($answer->employeeType === 1){
    $this->myModel->insertData($answer,'type_one_table');
}

И в вашей модели у вас будет что-то вроде:

public function insertData($answer,$table){
    $query = DB::table($table)->insertGetId($answer); // returns the id of the new record

    return $query;
}

Так что в каждом операторе if-else вы просто меняете имя таблицы, передавая ее функции модели, и этоЭто.

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