Избегайте общей области cgi

У меня есть много контроллеров FW/1, которые могут выполнять разные функции в зависимости от того, является ли запрос получением или отправкой. У меня есть много кода, который выглядит так

if (cgi.request_method == "post")   {

Недавно я установил CLI CodeChecker от Commandbox и отключил его на своих контроллерах. Я получаю предупреждения, такие как:

Don't use shared scope variables in a CFC | Standards | Severity: 4
  Avoid using shared scope variables from within a CFC as it breaks encapsulation.
  Users//jamesmohler/Sites/ColdFusion/P.../messagesController.cfc:13

Я вернулся к Справочному руководству FW/1 , и я заметил, что у него есть функция под названием getCGIRequestMethod()

Вопрос

Я все это время неправильно тестировал POST? Чего именно мне рекомендуется избегать?


person James A Mohler    schedule 16.10.2018    source источник
comment
Строго говоря, я думаю, что это нарушит инкапсуляцию, потому что вы получаете доступ к глобальной переменной непосредственно из своего метода. Я думаю, что это похоже на ответ здесь - stackoverflow.com/a/35818502/1636917   -  person Miguel-F    schedule 16.10.2018
comment
В том же духе я думаю, что рекомендация избегать общих областей видимости состоит в том, чтобы уменьшить зависимости с помощью теории о том, что объекты становятся более гибкими, если необходимые значения передаются в качестве аргументов, а не доступны напрямую через общую область. Хотя не уверен, какая альтернатива была бы в этом случае, кроме использования метода getHTTPRequestData().   -  person SOS    schedule 16.10.2018
comment
Я бы также сказал, что если cgi.request_method (или другой глобально доступный метод области видимости) изменится на cgi.requestMethod, то вам придется изменить каждое место, на которое ссылается request_method, а не просто изменить его в getCGIRequestMethod(). Я вижу обе стороны. Весь смысл области действия CGI заключался в том, что она доступна для всего запроса, независимо от того, какой язык вы используете. Но если посмотреть на это под более широким углом, это по-прежнему глобальная переменная, а глобальные переменные (по определению) могут быть изменены вне части кода, с которым вы работаете.   -  person Shawn    schedule 16.10.2018
comment
В какой-то момент должна быть логика, которая решает, что такое полезная нагрузка и как с ней обращаться. В этой заметке (я не знаю FW/1), не поддерживаются ли контроллеры, специфичные для HTTP-глагола? В основном то, что doGet и doPost предлагают в сервлетах Java. Они будут вызываться на основе данных CGI и передавать полезную нагрузку.   -  person Alex    schedule 16.10.2018


Ответы (1)


Короткий ответ

я заменил

 if (cgi.request_method == "post")   {

с

 if (framework.getCGIRequestMethod() == "post")   {

Длинный ответ

FW/1 подключается к другим переменным CGI, но не раскрывает их. Таким образом, нет никаких подобных функций, которые я могу использовать.

FW/1 копирует данные в

request._fw1 = {
   cgiScriptName = CGI.SCRIPT_NAME,
   cgiPathInfo = CGI.PATH_INFO,
   cgiRequestMethod = CGI.REQUEST_METHOD,
   ...

Напрашивается вопрос о том, что область действия request. лучше, чем область действия cgi.. Настоящим я представляю это не потому, что и то, и другое происходит во время обработки запроса. Использование cgi. может нарушить инкапсуляцию, но я не думаю, что добавление переменных через область действия FW/1 rc. нежелательно. Я также не хочу модифицировать FW/1 для захвата всех переменных cgi.

person James A Mohler    schedule 19.10.2018