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
答案 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'])'
}