Соната работает так:
Прилетает роут, по роутеру запускается CRUD контроллёр, затем вызывается пользовательский сервис ExampleAdmin. Контроллер отдаёт данные после сервиса во вьюху, а далее простейшая магия.
foreach ($this->getBlocksByContext($context) as $block) {
$data[$block->getName()] = $block->render();
}
return $this->render($template, $data);
Во вьюхе просто вывод в цикле
{% for item in items %}
{{ item | raw }}
{% endfor %}
Вот и всё.
ЗЫ. Разумеется код в сонате другой, но принцип этот.
Следовательно, изменив контекст, мы получим рендер блоков, принадлежащих контексту.
"cms" и "admin" в сонате просто стандартны, она использует их.
Именно по этому блок sonata.admin.block.admin_list мы увидим только в админке, а не на странице нашего сайта.