在自定义奏鸣曲块中获取容器的实例

Mas*_*iro 2 symfony sonata-admin

我正在为仪表板创建一个自定义块,我想在其中显示持久存储在数据库中的信息.如何在块服务中获取容器或doctrine实体管理器的实例?

尝试谷歌搜索很多但到目前为止没有任何实质性的

Ioa*_*sda 9

当您在奏鸣曲中创建一个新块时,您必须将其声明为服务,因此您可以注入doctrine.orm.entity_manager.我可以向您展示我注入实体管理器的块的示例:

//My\Bundle\Block\MyBlockService

use Symfony\Component\HttpFoundation\Response;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Validator\ErrorElement;
use Sonata\BlockBundle\Model\BlockInterface;
use Sonata\BlockBundle\Block\BaseBlockService;
use Sonata\BlockBundle\Block\BlockContextInterface;

class MyBlockService extends BaseBlockService
{
    protected $em;

    public function __construct($type, $templating, $em)
    {
        $this->type = $type;
        $this->templating = $templating;
        $this->em = $em;
    }

    public function getName()
    {
        return 'MyBlock';
    }

    public function getDefaultSettings()
    {
        return array();
    }

    public function validateBlock(ErrorElement $errorElement, BlockInterface $block)
    {
    }

    public function buildEditForm(FormMapper $formMapper, BlockInterface $block)
    {
    }

    public function execute(BlockContextInterface $blockContext, Response $response = null)
    {
        $settings = array_merge($this->getDefaultSettings(), $blockContext->getBlock()->getSettings());

        $data = count($this->em->getRepository("MyBundle:Entity")->findAll());

        return $this->renderResponse('MyBundle::myblock.html.twig', array(
            'block' => $blockContext->getBlock(),
            'settings' => $settings,
            'data' => $data,
        ), $response);
    }
}
Run Code Online (Sandbox Code Playgroud)

声明你在services.yml中阻塞并注入你需要的任何东西:

//services.yml
sonata.block.service.myblock:
        class: My\Bundle\Block\MyBlockService
        arguments: [ "sonata.block.service.myblock", @templating, @doctrine.orm.entity_manager ]
        tags:
            - { name: sonata.block }
Run Code Online (Sandbox Code Playgroud)

声明你在config.yml://config.yml中阻止

sonata_block:
    default_contexts: [cms]
    blocks:
    # Enable the SonataAdminBundle block
    sonata.admin.block.admin_list:
        contexts:   [admin]
    sonata.block.service.myblock: ~
Run Code Online (Sandbox Code Playgroud)

然后,当然,您必须为块创建模板:

{# myblock.html.twig #}
{% extends 'SonataBlockBundle:Block:block_base.html.twig' %}


{% block block %}
   <p>{{ data }}</p>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)