さて、これに遭遇した人のために、execute() で空の Response を返すだけで解決しました。私のユースケースは、特定の役割を持つユーザーにブロックを表示したい場合でした。最初に、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;
}
最後に、実行機能で最初にしたことは、次のようにユーザーの特定のロールを確認することでした。
//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
これは機能しますが、ハックのように感じます。主に、ブロックはすべてのステージを通過し、出力でのみ何も返さないため、オーバーヘッドが発生します。より良い解決策は、何らかのカスタム コードに基づいて、ブロック全体が読み込まれないようにすることです。
結論として、これは最善の方法ではありませんが、私にとってはうまくいきました!