В качестве продолжения предыдущего вопроса , где я попросил решение нерешенной проблемы, я пытаюсь найти способ выразить произвольный идентификатор «читабельным» способом.
Контекст: мы работаем с сущностями (объектами модели домена из DDD ), которые имеют идентичность . Этот идентификатор (сопоставленный первичному ключу базы данных) может быть выражен в виде строки: '123'
, 'ABC'
.
Некоторые сущности могут иметь составную идентичность , то есть составленную из двух или более других сущностей * : array('123','ABC')
.
Иногда мы хотим распечатать эту идентичность или использовать ее там, где разрешена только одна строка (например, в значении HTML <option>
). Процесс должен быть предсказуемым и обратимым, то есть не должно быть никакой двусмысленности в том, как вернуть его в исходное состояние.
Когда мы хотим, чтобы человек читал эту личность , для целей отладки легче читать 123
, ABC
или 123~ABC
, чем a:2:{i:0;s:3:"123";i:1;s:3:"ABC";}
, поэтому мы не делаем я не хочу использовать встроенные функции, такие как serialize()
или json_encode()
.
json_encode () выполняет довольно хорошую работу, но когда она используется в HTML, где кавычки должны быть правильно закодированы, она становится совершенно нечитаемой:
<option value="["123","ABC"]">
Где мы могли бы использовать хороший формат, такой как этот:
<option value="123~ABC">
При публикации HTML-формы мы должны иметь возможность вернуть этот кодированный идентификатор в исходное состояние: array('123','ABC')
, чтобы получить правильный объект .
Наконец, вполне приемлемо, что формат становится (по-человечески) сложным для чтения, если тождество содержит другие символы, отличные от букв и цифр.
Некоторые основные примеры:
'123'
=> '123'
'ABC'
=> 'ABC'
array('123','ABC')
=> '123~ABC'
(просто идея)
'string with non-alphanumeric, even non-àscìì char$'
=> ?
Любое (более или менее сложное) представление приемлемо для строк, содержащих другие символы. Результирующая строка должна содержать только символы ASCII, даже если исходная строка содержит символы не ASCII. Весь процесс должен быть полностью обратимым.
Есть идеи, как это сделать?