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