Как управлять URL-адресами с большим количеством параметров запроса?

Как вы управляете большими URL-адресами (с большим количеством параметров запроса) в своем приложении?

Например, посмотрите эту ссылку на ebay (не нажимайте на ссылку, это просто пример большого URL-адреса):

http://www.ebay.com/sch/Cameras-Photo-/625/i.html?LH_ItemCondition=1&LH_Price=15..500%40c&rt=nc&LH_Auction=1&LH_BIN=1&_nkw=nikon&_catref=1&_clu=2&_fcid=12&_fln=1&_localstpos=&_mPrRngCbx=1&_sc=1&_sop=15&_stpos=&_trksid=p3286.c0.m283&gbr=1

Вы можете увидеть множество параметров, многие из них со странными и короткими именами, такими как «_f», «_sc» и т. д.

Вы не можете использовать эти параметры в своем приложении, вам нужно преобразовать их во что-то более «читабельное»:

 $readableName = $_GET['_f'];

но тогда вы закончите с большим количеством переменных, и, возможно, вам все они нужны в функции, поэтому вместо новой переменной для каждого параметра запроса мы можем использовать массив:

$readableParams['readableName'] = $_GET['_f']; 

Но тогда мы заканчиваем большим массивом с произвольной структурой, поэтому я думаю, что лучше всего иметь VO (DTO) для этих параметров, что-то вроде:

$filterVo = new FilterVo();
$filterVo->readableName = $_GET['_f'];

Это нормально, но куда мы поместим этот код? Я имею в виду, где лучше всего сделать преобразование из "редких параметров запросов" в "объекты с четкими значениями"?
Потому что нам также нужен обратный процесс, чтобы мы могли создать ВО с данными, а затем сгенерировать URL-адрес. с правильными параметрами запроса из этого ВО.

Внутри ВО? Вспомогательный класс URL? Посмотреть базовый класс модели?

Как вы управляете этими URL-адресами с большим количеством параметров?


person Enrique    schedule 05.09.2011    source источник


Ответы (2)


Интересно, что вы упомянули, что входные имена загадочны. Я собираюсь ответить в общем смысле (не только о специфике PHP) о том, что я видел в своих проектах, что я считаю относящимся к этой теме. Общий подход:

  • Переменные формы обычно сопоставляются с объектом. Это VO в PHP или Beans в Java. Это были бы наиболее читаемые формы преобразования (на мой взгляд), поскольку они дают контекст конвертируемым HTML-формам.
  • Во многих случаях я видел какой-то вспомогательный класс Form Utilities, который будет обрабатывать преобразование в и из. Однако это не конкретное жестко закодированное преобразование, большая часть преобразования очень структурирована и универсальна. Например, он берет все методы получения/установки и использует их в качестве имени формы. Например, у меня может быть getUsername() в моем объекте, тогда утилиты форм преобразуют его, например, в <input name="username"/>.
  • Optionally, you could also override the default mapping via mapping override. This could be in the form of :
    • Configuration file, for example an XML File that maps the instance variable to the the form variable. In the example above, such mapping could be to map username instance variable to a more cryptic form variable named u
    • Функция языка, такая как аннотация в Java или атрибут в C#. Функция языка позволит сделать сопоставление без файла конфигурации, но будет встроено в сам исходный код объекта.
  • Я видел проекты, которые имели бы базовый класс для VO/Bean, который имеет fromForm(input) и toForm(), которые используют Утилиты форм, упомянутые выше. Это обеспечивает удобство для разработчиков, поэтому им не нужно иметь дело с утилитами форм, а просто вызывать toForm() и fromForm(input) из своего объекта для обработки преобразования.

Теперь, учитывая приведенный выше шаблон, для загадочных полей формы я обычно вижу:

  • Создайте объект VO для представления полей
  • Создайте конфигурацию сопоставления, чтобы сопоставить загадочное поле с фактической переменной экземпляра с логическим именем.
  • Либо используйте вспомогательный класс Form Utilities напрямую, либо, если Form Utilities используются в базовом классе, используйте удобные методы toForm() и fromForm(input)
person momo    schedule 05.09.2011
comment
Я выбрал для создания всех моих ссылок вспомогательный класс (мои представления/view_model используют этот класс), они принимают VO и возвращают ссылку. И обратный процесс находится внутри правильного controller_action. Во всяком случае, я не уверен в этом решении, потому что код для преобразования VO в RequestParams теперь находится в двух разных местах. И я не знаю, как решить эту проблему с помощью параметров POST (запрос POST не является ссылкой, поэтому, возможно, мне нужен дополнительный помощник FormParamsGenerator). Может быть, использование toParam и fromParam в ВО чище (даже больше, если мы используем интерфейс), я надеялся, что это общий шаблон :( - person Enrique; 09.09.2011
comment
Согласен, что использовать туда и обратно на самом ВО чище. Как я писал в своем ответе, туда и обратно в VO можно вызывать Form Utilities (вспомогательный класс) для работы. Что касается вашего параметра POST и GET, вы хотите обобщить структуру данных в структуру таблицы пары ключ-значение, которую вы передаете своему вспомогательному классу (вместо того, чтобы делать его GET против конкретных данных POST) и иметь расширение этого вспомогательного класса как PostFormUtilities и GetFormUtilities, и их работа заключается в преобразовании конкретных данных POST/GET и преобразовании их в обобщенные данные таблицы "ключ-значение". - person momo; 09.09.2011
comment
Чтобы ответить на ваш вопрос, является ли это распространенным шаблоном, ответ - да. Не только для сопоставления между параметрами HTTP, но и является общим шаблоном для любого типа сопоставления (в частности, сопоставления DB с VO или сопоставления XML с VO). Во многих из этих сценариев у вас будут эквиваленты функции в классе VO или Utility. Если вам нужны дополнительные разъяснения, дайте мне знать, и я могу обновить ответ - person momo; 09.09.2011
comment
Проблема с VO::from и VO::to заключается в том, что мы помещаем код, принадлежащий контроллеру или запросу, внутрь нашего VO. Мне это не нравится, а также мы исправляем связь между параметрами запроса и VO (вы не может иметь 2 действия, которые получают разные параметры запроса, но генерируют один и тот же ВО). Я думаю, что продолжу решение Link::to и ControllerAction::from, это правда, что синтаксический анализ находится в двух местах, но я думаю, что это правильные места. И параметры POST не являются проблемой, потому что они принадлежат только одному представлению, поэтому, возможно, нам для этого не нужно ничего особенного. Спасибо! - person Enrique; 09.09.2011

Большинство этих параметров генерируются автоматически. Я видел такое поведение во многих приложениях ASP.NET. И я ненавижу .NET за такие вещи, но я не хочу поднимать эту тему снова.

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

С другой стороны, вы могли бы реализовать такой механизм, который вы описываете. В среде MVC эта задача будет обрабатываться контроллером. Это имеет смысл только в том случае, если у вас есть МНОГО передаваемых параметров GET. Вы должны стараться избегать такой практики с самого начала.

person thwd    schedule 05.09.2011
comment
Да, я работаю с фреймворком MVC, и проблема на самом деле в том, что у меня много параметров GET (например, ссылка с ebay). Контроллер — это правильное место для чтения этих параметров и, следовательно, преобразования в некоторые VO/DTO, но куда поместить обратный процесс? как вы генерируете ссылку? это должно быть частью View (или View_Model), но тогда у нас есть преобразование и отображение URL в/из VO в двух разных местах. - person Enrique; 06.09.2011
comment
Теоретически эта задача также будет обязанностью контроллера, так как контроллер отвечает за обработку запросов, независимо от того, готовим ли мы входящие запросы для следующего. - person thwd; 06.09.2011
comment
Я думаю, что это неправильно, генерация ссылок — это задача для View, или даже лучше, View_Model, если вы используете этот шаблон. Мои контроллеры ничего не знают о том, как генерировать представление, им нужно вызывать только view_model, а также ссылки могут генерироваться любым представлением и, следовательно, любым контроллером с вашей точки зрения, что приносит много проблем DRY. Прямо сейчас у меня есть вспомогательный класс для создания ссылок, этот класс использует параметры и класс Route и используется моей View_Model. - person Enrique; 06.09.2011