如果类存在&&如果方法存在PHP / Laravel

时间:2019-05-20 22:08:35

标签: php laravel validation abstract

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模型中的函数调用为{ {1}}。

我认为这里不需要对任何存在进行检查,因为针对输入定义了验证参数,因此,如果不存在,将使用$this->caseValidator::{$validate}($data);

跳过此检查。

但是,我正在使用if (array_key_exists($dataKey, $inputValidators))在第二个代码块中将一些数据分散到其他表中。从字面上看,这将遍历所有数组键,而不管是否存在用于它的方法,因此如第一个块中所示,无法进行初始检查。我尝试使用mapCase()class_exists(),但从逻辑上讲,它不合适,并且我不能指望它们按我的意愿工作,也许我在method_exists中的方法不正确?我想如果我为每个键定义一个类,我应该改为使用一个类并在那里存在方法,这将消除检查现有类的需要。请指教

参考:

mapCase

1 个答案:

答案 0 :(得分:0)

考虑到我知道方法名称与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'])'
    }