MVC - Санитарная обработка данных, где? - PullRequest
1 голос
/ 29 марта 2010

Я использую CakePHP, но это вопрос о шаблоне MVC. У меня есть форма ввода текста для тегов (через запятую). Чтобы добавить теги, я создал метод модели тегов, который в основном проверяет, существует ли тег, а затем добавляет новый тег или просто новый модуль в счетчик тегов (модель тегов имеет следующие поля: id, name, slug, count) , В контроллере я взрываю поле тегов и пропускаю по одному тегу за раз. Вопрос в том, где я могу санировать данные? В контроллере или в модельном методе? Я думаю, что это должно быть в контроллере, потому что это то место, где я взрываюсь, но с точки зрения возможности повторного использования, я думаю, что я должен очистить данные в модели. Что ты думаешь?

Ответы [ 4 ]

2 голосов
/ 29 марта 2010

Вы должны санировать свои данные в представлении на стороне клиента и контроллере на стороне сервера.

2 голосов
/ 29 марта 2010

Я бы сказал, что, строго говоря, очистка ваших данных должна происходить в контроллере, но очистка также обычно относится к очистке пользовательского ввода, чтобы избежать многих проблем, таких как внедрение SQL. Поскольку вы используете термин «дезинфекция» в другом контексте, мы должны уделять больше внимания тому, что это за контекст.

Вы не очищаете пользовательский ввод, а это означает, что в контроллере этого не требуется. Вы изменяете результат этого действия в зависимости от того, существует ли сохраняемый элемент в базе данных. Поэтому, на мой взгляд, это должно происходить в модели (или, как определено MunkiPhD, иметь метод в некотором классе вспомогательного класса, который вы можете вызывать из любого места - но я говорю, вызывайте его в модели).

Редактировать: Обычно в MVC модель знает, должна ли она сохранять новую строку в базе данных или обновлять существующую в зависимости от того, имеет ли экземпляр вашей модели действительный идентификатор. Если у него есть идентификатор, модель следует сохранить в строке, индексированной по этому идентификатору. Если это не так, модель создает новый. Насколько я понимаю, все, что вы хотите сделать, это знать, где заставить его решать, создавать ли новый или обновлять существующий, и это происходит в модели.

1 голос
/ 29 марта 2010

Я не согласен с обработкой данных для хранения в контроллере и считаю, что лучше всего делать это в модели, поскольку контроллер не должен знать, как хранятся данные, но для очистки необходимы эти знания (например, mysql_real_escape_string() для хранения данных). MySql против pg_escape_string() для PostgresQL или, возможно, проверка на допустимый XML, если он хранится в файле XML, или что-то еще для других механизмов хранения).

Чтобы предотвратить такие вещи, как межсайтовый скриптинг, не выполняйте санитарную обработку данных перед сохранением, так как впоследствии вы можете использовать их для некоторых HTML-тегов и делать это (в идеале) в поле зрения или в контроллере.

1 голос
/ 29 марта 2010

Вы бы хотели очистить его от вашего контроллера, однако, «от» не означает «в». Отдельный класс должен обрабатывать данные - таким образом, вы можете вызывать этот класс из любой точки, где вам нужно.

По сути, вы хотите создать контракт, согласно которому ваша модель будет постоянно получать хорошие данные, а это значит, что вам придется предварительно санировать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...