Я пытался заставить это работать некоторое время и не могу найти много документов на нем.Или любые случаи использования, когда политика изолированной программной среды использовалась вне среды Symphony.
Я использую Twig в качестве отдельного пакета, поэтому не могу использовать псевдокод Symphony.
У меня включен строгий режим, поэтому песочница влияет на все шаблоны.Большинство шаблонов отрисовываются нормально, за исключением того, который вызывает класс.Однако я не знаю, как его пропустить.
Класс:
class GetThings {
public function doStuff() {
return array(
'id' => '...',
'data' => '...'
);
}
}
...
Веточка:
$allowedTags = ['if', 'else', 'elseif', 'endif', 'for', 'endfor'];
$allowedFilters = ['upper', 'escape'];
$allowedMethods = [
'GetThings' => array('doStuff') // Possibly this may be wrong?
];
$allowedProperties = [
'GetThings' => array('id', 'data') // Or this is wrong? But not sure the correct way.
];
$allowedFunctions = ['range'];
$policy = new Twig_Sandbox_SecurityPolicy($allowedTags, $allowedFilters, $allowedMethods, $allowedProperties, $allowedFunctions);
$sandbox = new Twig_Extension_Sandbox($policy, true);
...
Шаблон:
{% for i in info %}
{{ i.id }} <- Code that raises securityPolicy exception.
{{ i.data }} <- Code that raises securityPolicy exception.
{% endfor %}
Я полагаю, что это может быть связано с разрешенными методами или свойствами, но я не смог найти какие-либо рабочие примеры их использования.Я тоже пробовал полные пространства имен, ничего.
EDIT : Поэтому я посмотрел на эту ошибку немного глубже и нашел трассировку стека исключений, по какой-то причине он считает, что мой классStdClass, а не GetThings?Не уверен почему.Любые идеи?
Twig_Sandbox_SecurityNotAllowedPropertyError: Calling "id" property on a "stdClass" object is not allowed.
Чтобы создать экземпляр класса, я просто делаю следующее:
public function index() {
$data = new GetThings();
// echo get_class($data); // returns GetThings as expected...
return $twig->render('index.twig', [
'info' => $data->doStuff()
]);
}
Если я сделаю 'StdClass' => array('id', 'data')
для разрешенных свойств, страницаработает отлично.Но я чувствую, что это не работает, как задумано, так как StdClass может быть чем угодно?И GetThings должен работать, не так ли?
РЕДАКТИРОВАТЬ :
Я думаю, я понял это.Так что мои разрешенные свойства позволяют 'GetThings' => [id, data]
, что хорошо.doStuff()
возвращает массив объектов \PDO
, используя опцию \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_OBJ
, которая заставляет PDO преобразовать все возвращаемые значения в StdClass
объекты.
Есть ли способ обойти это?Я хочу сохранить эту опцию, но все же хочу ссылаться на политику как 'GetThings' => [...]
вместо 'StdClass' => [...]