Ну, для тех, кто сталкивается с этим, я решил это, просто вернув пустой ответ в execute(). В моем случае использования я хотел показать блок пользователям с определенной ролью: сначала я определил свою службу для использования службы security.context следующим образом:
sonata.block.service.foo:
class: Acme\DemoBundle\Block\FooBlockService
arguments: [ "sonata.block.service.foo", "@templating", "@doctrine", "@security.context" ]
tags:
- { name: sonata.block }
Затем я определил блочную службу __construct() как:
//Acme\DemoBundle\Block\FooBlockService
public function __construct($name, EngineInterface $templating, $doctrine, $securityContext)
{
parent::__construct($name, $templating);
$this->doctrine = $doctrine;
$this->securityContext = $securityContext;
}
Наконец, в функции execute первое, что я сделал, это проверил конкретную роль пользователя следующим образом:
//Acme\DemoBundle\Block\FooBlockService
public function execute(BlockContextInterface $blockContext, Response $response = null)
{
if( $this->securityContext->isGranted("ROLE_ACME_FOO") === false )
{
return new Response();
}
//... more code
Это работает, но похоже на взлом. В основном потому, что Блок проходит все свои этапы и только на выходе ничего не возвращает, то есть накладные расходы. Лучшим решением было бы каким-то образом предотвратить загрузку всего блока на основе некоторого пользовательского кода.
В заключение, это не лучший способ, но он сработал для меня!
person
Frank van Luijn
schedule
24.02.2014