Предоставить удобочитаемое представление идентификатора? - PullRequest
1 голос
/ 22 июня 2011

В качестве продолжения предыдущего вопроса , где я попросил решение нерешенной проблемы, я пытаюсь найти способ выразить произвольный идентификатор «читабельным» способом.

Контекст: мы работаем с сущностями (объектами модели домена из 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="[&quot;123&quot;,&quot;ABC&quot;]">

Где мы могли бы использовать хороший формат, такой как этот:

<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. Весь процесс должен быть полностью обратимым.

Есть идеи, как это сделать?

Ответы [ 3 ]

1 голос
/ 22 июня 2011

Основываясь на отзывах, которые вы дали в комментариях, я бы предложил вам кодировать атомы-идентификаторы с помощью urlencode или rawurlencode

Затем вы можете создать атом-композиция с использованием , двоеточий.

class Identifier {
    static function encode(array $identifier) {
        return implode(', ', array_map('rawurlencode', $identifier));
    }
    static function decode($identifier) {
        return array_map('rawurldecode', 
            array_map('trim', explode(',', $identifier))
        );
    }
}

$identifier = array('111', 'abc');
var_dump($identifier);

$encoded = Identifier::encode($identifier);
var_dump($encoded);

$decoded = Identifier::decode($encoded);
var_dump($decoded);
1 голос
/ 22 июня 2011
str_replace( array('[',']','&quot;',',') ,
             array('','','','~'),
            json_encode($stuff)
);

Ваши вопросы очень многословны и не объясняют, чего вы действительно хотите достичь.

0 голосов
/ 22 июня 2011

Вы можете использовать 2 специальных символа:

~ - разделитель

* - экранирующий символ (для экранирования или самого экранирующего символа)

Примеры:

array('123','ABC') => 123~ABC
array('12*3','A~BC') => 12**3~A*~BC

Вы можете выбрать разные символы для разделителя и escape-символа. Если выбранные символы будут редко использоваться, строка обычно будет хорошо читаемой.

...