Я работаю с веб-приложением, которое использует сложную смесь серверного PHP и клиентского Javascript, и я хотел бы позволить администраторам настраивать некоторые основные условия. Например, у нас может быть модель данных с:
var person = {
name: 'Alice',
age: 33,
favorite_color: 'purple',
address: {street: '123 Some St', state: 'NY'}
};
Администратор может захотеть скрыть поле или запустить действие на основе условия, такого как:
((person.age > 20) or (person.favorite_color == 'red')) and (person.address.state == 'NY')
В идеале, мы могли бы использовать одни и те же условия в разных контекстах, например, на стороне клиента. а также проверка на стороне сервера.
Если бы приложение было только PHP на стороне сервера, или если бы это был JS с полным стеком, то вы могли бы использовать PHP eval()
или JS eval()
, Но для приложения с несколькими языками это не работает. Кажется, что нужно создать небольшой DSL с реализациями для разных платформ, например
// JS
var condition = "(person.age > 20) or (person.favorite_color == 'red')";
var isMatch = ExpressionLanguage.eval(condition, {
person: {...}
})
// PHP
$condition = "(person.age > 20) or (person.favorite_color == 'red')";
$isMatch = ExpressionLanguage::eval($condition, array(
'person' => array(...),
));
Я сталкивался усы, который принимает такой же переносимый подход к шаблонам. Тем не менее, его дизайн специально «без логики» и не поддерживает условия. Тем не менее, это кажется достаточно распространенной проблемой. Как другие обратились к желанию переносных кондиционеров?
Задача ещё не решена.
Других решений пока нет …