Если класс существует && Если метод существует PHP / Laravel - PullRequest
0 голосов
/ 21 мая 2019

PHP / Laravel

Эй, я перехожу к абстракции в php и пытаюсь проверить и сохранить значения на основе того, что было отправлено, где я ожидаю, что методы не должны знать, что проверять и / или какой класс и метод использовать сделать это -

То, что у меня есть, работает, но я вижу, что будут проблемы, когда классы / методы не существуют. Здесь лежит мой вопрос.

Если бы я вызывал метод в следующем формате, какой способ лучше всего проверить, если class_exists() или method exists()?

public function store(Request $request)
{
    $dataSet = $request->all();
    $inputs = $this->findTemplate();

    $errors = [];
    $inputValidators = [];
    foreach ($inputs as $input) {
        $attributes = json_decode($input->attributes);
        if (isset($attributes->validate)) {
            $inputValidators[$input->name] = $input->name;
        }
    }

    foreach ($dataSet as $dataKey => $data) {
        if (array_key_exists($dataKey, $inputValidators)) {
           $validate = "validate" . ucfirst($dataKey);
           $validated = $this->caseValidator::{$validate}($data);
            if ($validated == true) {
                $inputValidators[$dataKey] = $data;
            } else {
                $errors[$dataKey] = $data;
            }
        } else {
            $inputValidators[$dataKey] = $data;
        }
    }

    if (empty($errors)) {
        $this->mapCase($dataSet);
    } else {
        return redirect()->back()->with(['errors' => $errors]);
    }
}
public function mapCase($dataSet)
{
    foreach($dataSet as $dataKey => $data) {
        $model = 'case' . ucfirst($dataKey);
        $method = 'new' . ucfirst($dataKey);
        $attribute = $this->{$model}::{$method}($dataKey);

        if($attribute == false) {
            return redirect()->back()->with(['issue' => 'error msg here']);
        }
    }
    return redirect()->back->with(['success' => 'success msg here'])'
}

Для некоторого дополнительного контекста форма ввода будет состоять из набора входных данных, которые могут быть изменены в любое время. Поэтому я сохраняю все значения как «полезную нагрузку» json.

Когда пользователь отправляет указанную форму, сначала обнаруживается активный шаблон, который предоставляет подробную информацию о том, что должно быть проверено $input->attributes, после того как это было определено, я могу вызывать функции из caseValidator модели как $this->caseValidator::{$validate}($data);.

Я не думаю, что здесь понадобятся какие-либо проверки на существование, так как параметры проверки определены для входных данных, поэтому, если их не существует, эта проверка будет пропущена с использованием if (array_key_exists($dataKey, $inputValidators))

Однако я распространяю некоторые данные в других таблицах во втором блоке кода, используя mapCase(). Это буквально повторяется по всем ключам массива, независимо от того, существует ли метод для него, и, следовательно, первоначальная проверка не может быть выполнена, как видно в первом блоке. Я пытался использовать class_exists() и method_exists, но по логике он не подходит, и я не могу ожидать, что они будут работать так, как мне хотелось бы, возможно, мой подход в mapCase не верен? Я предполагаю, что, если я определяю класс для каждого ключа, я должен вместо этого использовать один класс и иметь там методы, которые устранят необходимость проверки существования класса. Пожалуйста, сообщите

Справка:

$attribute = $this->{$model}::{$method}($dataKey);

1 Ответ

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

Решил потенциальную проблему с помощью class_exists(), учитывая, что я знаю имена методов, так как они совпадают с $dataKey.

    public function mapCase($dataSet)
    {
        foreach($dataSet as $dataKey => $data) {
            $model = 'case' . ucfirst($dataKey);
            if (class_exists("App\Models\CaseRepository\\" . $model)) {
                $method = 'new' . ucfirst($dataKey);
                $attribute = $this->{$model}::{$method}($dataKey);
            }

            if($attribute == false) {
                return redirect()->back()->with(['issue' => 'error msg here']);
            }
        }
        return redirect()->back->with(['success' => 'success msg here'])'
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...