PHP, ООП - Проверка формы
Я создал класс элемента формы. Класс способен
- Создать HTML элементы формы и
- Подтвердите, была ли отправлена форма, и, если да, загрузите переданное значение для указанного элемента формы в объект, над которым работаете на странице.
Я пытался сделать это как можно более общим, чтобы сделать его многоразовым, но так как я новичок в отношении ООП, было бы очень круто, если бы кто-то мог проверить это и сообщить мне, если это хороший ООП, также, если это хорошее решение для того, чего я пытаюсь достичь.
Вот основная часть class_FormControl()
class FormControl{
var $finalcontrol;
var $class = "form-control";
var $form_error;
protected function StartFormatting($name, $label){
if (isset($_POST[$name]) AND $_POST[$name] != "") {
return false;
}
$this->finalcontrol = "<label for='$name' >$label</label>";
return true;
}
public function get_control(){
return $this->finalcontrol;
}
}
class TextBox extends FormControl{
public function CreateControl($obj, $name, $label, $placeholder, $value = ""){
if($this->StartFormatting($name, $label)){
$this->finalcontrol .= "<input type='text' class='$this->class' id='$name' name='$name' placeholder='$placeholder'";
if ($value != "") {
$this->finalcontrol .= " value='$value' ";
}
$this->finalcontrol .= ">";
return true;
}
$func = "set_" . $name;
$obj->$func($_POST[$name]);
return false;
}
}
А вот как я использую класс на странице формы:
$r1 = New Recipe();
$tbx = new TextBox();
$ctrl1 = $tbx->CreateControl($r1, "Name", "Nombre", "Nombre", $r1->get_Name());
Теперь, если $ctrl1 равен true, я продолжаю и сохраняю объект в базе данных.
Если $ctrl1 равен false, я продолжаю и
echo $tbx->get_control();
в нужном месте на странице.
/Спасибо!
1 ответ
Примечание: это не единственный способ сделать это; это один из многих, и это моя личная интерпретация проблемы за 10 минут до обеденного перерыва. Пожалуйста, имейте в виду, что это будет моя реализация с небольшой информацией, которую мне дали. В реальном мире я бы узнал больше о предметной области, но я все равно придерживался бы единого принципа ответственности в своих объектах и оставлял бы все свободно связанными. Это главные вещи, которые нужно отнять у этого поста.
OOP
Прежде всего, вы должны думать с точки зрения объектов. Каждый объект имеет свою собственную запись википедии:
В объектно-ориентированном программировании принцип единой ответственности гласит, что каждый контекст (класс, функция, переменная и т. Д.) Должен нести одну ответственность, и эта ответственность должна быть полностью инкапсулирована контекстом. Все его услуги должны быть тесно связаны с этой ответственностью. [акцент мой собственный].
Что вы делаете, это помещаете процедурный код в методы класса. Это не делает его объектно-ориентированным! Вы должны изменить свое мышление!
Объекты
Вы строите конструктор форм. Форма состоит из элементов. Мгновенно я думаю о:
Form
объектFormElement
объект
Вышеуказанные объекты являются конкретными представлениями Entity или ValueObject. Домен Управляемый Дизайн.
FormElement
может быть интерфейсом, которому должны соответствовать все элементы формы (например, поля ввода, кнопки и т. д.).
class Form
{
/**
* @var FormElement[]
*/
protected $elements;
/**
* Add a FormElement to the form
*
* @param FormElement $element
*/
public function addFormElement(FormElement $element)
{
$this->elements[] = $element;
}
}
interface FormElement
{
/**
* @return The generated html for the given form element
*/
public function getHtml();
}
Теперь все, что вам нужно сделать, это убедиться, что каждый из ваших объектов, которые реализуют FormElement
вернуть именно то, что вы хотите в пределах FormElement::getHtml()
метод, и все это будет отлично работать, когда вы добавляете новые элементы в Form
потому что это будет Form
это зовет getHtml()
в цикле на каждом из FormElement
объекты, прежде чем добавить это в свой собственный HTML и вывести его.
Вот пример TextBoxFormElement
Я хотел бы использовать:
class TextBoxFormElement implements FormElement
{
/**
* @constructor
*
* This is where I am declaring that, for this to be a VALID object, it MUST have
* the following properties passed in
*
* @param string $name
* @param string $label
* @param string $placeholder
* @param string $value
*/
public function __construct($id, $class, $name, $label, $placeholder, $value)
{
$this->id = $id;
$this->class = $class;
$this->name = $name;
$this->label = $label;
$this->placeholder = $placeholder;
$this->value = $value;
}
/**
* Generate the html of this element
*
* @return string
*/
public function getHtml()
{
return sprintf(
"<input type='text' id='%s' class='%s' name='%s' label='%s' placeholder='%s' value='%s'>",
$this->id, $this->class, $this->name, $this->label, $this->placeholder, $this->value
);
}
}
суперглобальные массивы
Ты используешь $_POST
а также $_GET
в этих классах. Вы не должны делать это. Вы должны сделать следующее:
Каждый объект, который вы пишете, публичные методы этих объектов диктуют свои API. Вы пишете API для использования этих объектов. [Моя цитата]
Эффективно, имея любой вид $_POST
или же $_GET
связывает эти объекты с состоянием этих суперглобальных Как вы собираетесь их проверить? Вам нужно будет макетировать (или подделывать) содержимое этих суперглобальных объектов каждый раз, когда вы захотите их протестировать.
Нет. То, что вам следует делать, - это на мгновение забыть о собственном приложении и кодировать эти объекты, чтобы вы могли использовать их в любом приложении. Затем вы передаете значения в конструктор объектов или методы. Не использовать $_POST
или же $_GET
прямо в этом классе.
Заключение
Вы не пишете код OO. Но я не собираюсь писать это для вас. Однако я напишу методы, которые я буду ожидать при использовании вашей библиотеки, в надежде, что вы сможете сами определить свою реализацию. Держите все отдельно, используйте одну ответственность за каждый объект (это не излишество, это объектно-ориентированное программирование) и продолжайте учиться:
// Sanitize and validate input data obviously you would have a RequestValidator used before you even get to this point, making sure exactly what you want can be used by the library
$name = $_POST['name'];
/** Create our form **/
$form = new Form;
/** TextBoxFormElement implements FormElement **/
$textBox1 = new TextBoxFormElement($name, 'Label', 'Placeholder' /** etc **/);
/** Add our FormElement **/
$form->addFormElement($textBox1);
/** Generate our html - the form generates it's own HTML as well as calling getHTML() on the FormElement objects in a loop **/
echo $form->getHtml();
Это ЭТО. Это объектный API, который вы должны создать. Это должно быть так просто. Теперь иди с этим магическим знанием и учись.
Дополнительная информация: Альтернатива - взглянуть на шаблон посетителя. По сути, вы отделяете то, что генерирует выходные данные, от того, что содержит данные. Вот больше информации по теме, если вы хотите взглянуть на это.
Всегда помните, что ваш код должен быть читаемым и легким для понимания, и что, если он помогает, вы должны создать некоторые стандартные UML-диаграммы, которые будут дополнять ваш код.