Применительно к дискуссии из которой как я понимаю возникла эта тема. Допустим вы хотите нарисовать форму ввода данных. В стандартной схеме вы должны заранее знать и передать в модель сведения о полях. Если это поля из ДБ, практически все уже есть в самой ДБ и модель может самостоятельно их закачать и передать по логике действия на вывод.
В процедурном стиле:
$columns = '"' . explode('","', $model_columns) . '"';
$q = strtolower('SELECT
`TABLE_NAME`
`COLUMN_NAME`,
`COLUMN_DEFAULT`,
`IS_NULLABLE`,
`DATA_TYPE`,
`CHARACTER_MAXIMUM_LENGTH`,
`CHARACTER_OCTET_LENGTH`,
`NUMERIC_PRECISION`,
`NUMERIC_SCALE`,
`CHARACTER_SET_NAME`,
`COLLATION_NAME`,
`COLUMN_TYPE`,
`COLUMN_KEY`,
`EXTRA`,
`COLUMN_COMMENT`
FROM `information_schema`.`columns`
WHERE `columns`.`table_schema` = "'.$db_name.'"
AND `columns`.`TABLE_NAME` = "'.$table_name.'"
AND `columns`.`COLUMN_NAME` IN (' . $columns . ');');
$res = $mysqli->query($q);
нужен тип поля? в column_type записи вида varchar(255) или enum('y', 'n') или int(10) unsigned, timestamp и так далее.
Парсим в методе, получаем нормальные данные.
Парсеру разобраться с типом поможет поле DATA_TYPE. В котором записи только о типе данных int, varchar, enum и тп. Еще помогут поля `CHARACTER_MAXIMUM_LENGTH`, `CHARACTER_OCTET_LENGTH`, `NUMERIC_PRECISION`, `NUMERIC_SCALE` - первые два для строк, вторые для чисел.
Собственно из column_type надо достать только атрибуты типа unsigned, zerofill и контент полей типа set, enum. В общем все делается в одном месте откуда приходит объект с нормальными данными по которым можно сгенерить что угодно.
Нормальные данные это структура объекта filed майскли. Может показаться не очень удобным сначала кодировать флаги и типы, а потом раскодировать, но это - нормально. Разумеется в объект можно всунуть родительские методы которые по команде сверху сами построят вам что хотите.
Поле nullable? Да - нет звезды. Нет - рендер добавляет звезду. Обязательное к заполнению. Валидатору ничего передавать не надо - у него тот же метод получения данных. Валидатор смотрит: поле пустое, оно нулабле? Нулабле - ок, пропускаем. Нет? - Исключение.
Короче все типовое можно отразить и проверить. Не типовое можно внедрять через либо коды на этапе парсинга, скажем сделать тип passw, придумать ему код типа и флаг. Или то же самое взять из бд по отношениям.