Я столкнулся с проблемой рефакторинга. У меня есть много похожих методов, но я не могу найти способ извлечь одну строку из них и создать другой закрытый метод.
private function constructRules($rules, \Languages $langs) {
foreach ($rules as $fieldType => $rule) {
foreach ($langs->all() as $lang) {
//line below changes
$langRules[$fieldType . '[' . $lang->lang . ']'] = $rule;
}
}
return $langRules;
}
У меня есть эти петли foreach в 4 разных местах. Если я извлекаю циклы foreach и возвращаю массив, мне все равно нужно сделать один цикл foreach в методе, чтобы заполнить $ langRules в этом примере. Может быть, есть простой способ сделать это, но я не могу это увидеть …
Разве это не просто вопрос выделения части задачи из этого кода в обратный вызов?
private function constructRulesUsingCallBack($rules, \Languages $langs, $task) {
$langRules = [];
foreach ($rules as $fieldType => $rule) {
foreach ($langs->all() as $lang) {
$task($langRules, $fieldType, $lang, $rule);
}
}
return $langRules;
}
$langRules = constructRulesUsingCallBack($rules, $langs, function (&$langRules, $fieldType, $lang, $rule) {
$langRules[$fieldType . '[' . $lang->lang . ']'] = $rule;
});
Я не так уж хорош с PHP, и меня не устраивает количество шаблонов, которые мне нужны в выражении встроенной функции, но PHP, похоже, не очень хорошо реализует замыкание (что я мог бы решить, во всяком случае) ,
Однако вы можете оставить constructRulesUsingCallBack()
Функция as должна просто обрабатывать цикл сейчас и просто передавать ему другую реализацию тела обратного вызова каждый раз, когда вам нужно что-то обработать в этих циклах.
Тот кажется выполнить то, что вам нужно, на основе вашего примера. Если нет, просьба уточнить, и я мог бы дополнить это, чтобы покрыть ваши потребности.
Других решений пока нет …